Leetcode 易错题整理(一)5. 7. 11. 15. 33. 34

5. 最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

我们可以根据前面的子串结果,在头尾拼接上一个字符并判断其是否相同。DP

class Solution {public String longestPalindrome(String s) {int len=s.length();int maxStart = 0; int maxEnd = 0; int maxLen = 1; boolean[][] isReverse=new boolean[len][len];for(int j=1;j<len;j++){for(int i=0;i<len;i++){//if(j-i+1<maxLen)continue;if((s.charAt(i)==s.charAt(j))&&((j-i<=2)||(isReverse[i+1][j-1]))){isReverse[i][j]=true;if(j-i+1>maxLen){maxLen=j-i+1;maxEnd=j;maxStart=i;}}else isReverse[i][j]=false;}}return s.substring(maxStart,maxEnd+1);}
}

注意第一层循环是右指针,第二层循环是左指针。这样才能用到前面的结果。

7. 整数反转

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321

翻转好做,但是有个要求:翻转后的数字大小超出了 int 范围则返回0.

我们用 long 存储翻转后的数字,如果 (int)res!=res 就返回0.

11. 盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。

返回容器可以储存的最大水量。

**说明:**你不能倾斜容器。

img

如图,给定一个 height[] 数组,让我找到盛水最高的两条边。

思路:直接遍历超时。首先我们让左右指针到最左最右。算出当前面积。

然后我们左右指针往里挪,底边变短,那么我们必须想办法让 height 最小值增加才能有面积的提升,因此我们让最矮的 height 那边指针先动,比如上图就是右边红色指针先动。这样效率高。

15. 三数之和

找到三数求和=0的所有组合。不能重复。肯定是不能直接遍历,太慢了。

  1. 排序数组。
  2. 从左到右遍历 i,从第二次遍历开始判断当前位数值和上一次循环是否相同,相同直接 continue.
  3. 从 i+1 到右遍历 j,和 i 一样如果和上次循环值一样则 continue。
  4. 从 nums.length-1 往左遍历 k。逻辑是我们固定了 i j,逐渐减小 k,直至找到求和=0的组合。如果求和结果 <0,说明 i j 太小了,继续尝试下一个 j。如果求和结果 >0 则一直向左移动 k 指针,直到求和结果=0或者 jk 相遇或者求和结果 <0. jk 相遇说明这个 i j 组合过大了,接下来 j 再继续增大求和结果也只会更大,没有继续尝试的必要了,因此直接跳出当前 j 循环即可。求和结果 <0 则尝试下一个 j。
class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List resList=new ArrayList<List>();int i=0,len=nums.length;for(;i<len-2;i++){if(i>0&&nums[i]==nums[i-1])continue;int target=-nums[i];for(int j=i+1;j<len-1;j++){if(j>i+1&&nums[j]==nums[j-1])continue;int k=len-1;while(j<k&&nums[j]+nums[k]>target)k--;if(j==k)break;else if(nums[j]+nums[k]==target){List subList=new ArrayList<Integer>();subList.add(nums[i]);subList.add(nums[j]);subList.add(nums[k]);resList.add(subList);}}}return resList;}
}

33. 下一个排列

整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。

  • 例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3][1,3,2][3,1,2][2,3,1]

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

  • 例如,arr = [1,2,3] 的下一个排列是 [1,3,2]
  • 类似地,arr = [2,3,1] 的下一个排列是 [3,1,2]
  • arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。

给你一个整数数组 nums ,找出 nums 的下一个排列。

必须** 原地 **修改,只允许使用额外常数空间。

主要就是算法。

  1. 第一遍,遍历数组检查是否为倒序,找到第一个不为倒序的位置。
  2. 第一个不为倒序的位置和它后面的数作比较,找到一个刚好大于他的最小的数,换到他的位置,然后排序其后面的位置。
  3. 如果全部满足为倒序排序,那么数组反转。
class Solution {public void swap(int[] nums, int i, int j){nums[i]=nums[i]^nums[j];nums[j]=nums[i]^nums[j];nums[i]=nums[i]^nums[j];}public void reverse(int[] nums){for(int i=0;i<=nums.length/2-1;i++){swap(nums, i, nums.length-1-i);}}public void nextPermutation(int[] nums) {int len=nums.length;int i=len-1;while(i!=0&&!(nums[i-1]<nums[i])){i--;}if(i==0)reverse(nums);else {i--;int min=101;for(int j=len-1;j>i;j--){if(nums[j]<min&&nums[j]>nums[i]){swap(nums, i, j);Arrays.sort(nums,i+1,len);return;}}}}
}

34. 在排序数组中查找元素的第一个和和最后一个位置

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值 target,返回 [-1, -1]

你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入:nums = [5,7,7,8,8,10], target = 8
输出:[3,4]

是二分法,但是不完全是,因为我们要找到起始区间。

我们可以通过两次二分,第一次找起始位置或小于目标值的最大的数的位置;第二次找结束位置或大于目标值的最小数的位置。

class Solution {public int[] searchRange(int[] nums, int target) {int len=nums.length;int[] res=new int[2];res[0]=-1;res[1]=-1;int left=0,right=len-1;while(left<=right){int mid=(left+right)/2;if(nums[mid]>=target){right=mid-1;res[0]=mid;}else left=mid+1;}left=0;right=len-1;while(left<=right){int mid=(left+right)/2;if(nums[mid]>target){right=mid-1;res[1]=mid;}else left=mid+1;}res[1]=right;if(!(res[0]<=res[1])||res[0]==-1||res[1]==-1){res[0]=-1;res[1]=-1;}return res;}
}

如果数组中一定存在给定数,那么只靠两个 while 循环是可以找到起始和结束位置的。但是如果不存在,这两个循环查询可能会出现一些错误,比如一个是找到的位置,一个是-1;或者 right<left。这种情况要单独判别后,再决定返回值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/59627.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

几个nlp的小任务(生成任务(摘要生成))

几个nlp的小任务生成任务——摘要生成 安装库选择模型加载数据集展示数据集数据预处理 tokenizer注意特殊的 token处理组成预处理函数调用map,对数据集进行预处理微调模型,设置参数设置数据收集器,将处理好的数据喂给模型封装测评方法将参数传给 trainer,开始训练安装库 选…

vue uniapp 同意验证码滑块验证

前言 &#xff08;vue-puzzle-vcode&#xff09; 发送验证码以及登录的时候会做验证&#xff0c;防止机刷等 效果图 一、安装依赖 npm install vue-puzzle-vcode --save二、使用步骤 1.html使用 <Vcode :show"isShow" success"onSuccess"/>2.j…

C++day7

1. #include <iostream> #include <vector> #include <fstream> using namespace std; class Stu { public:string name;int id;int age;Stu(){}Stu(string n,int i,int a):name(n),id(i),age(a){}void show(){cout << "姓名&#xff1a; "…

Jmeter 如何才能做好接口测试?

现在对测试人员的要求越来越高&#xff0c;不仅仅要做好功能测试&#xff0c;对接口测试的需求也越来越多&#xff01; 所以也越来越多的同学问&#xff0c;怎样才能做好接口测试&#xff1f; 要真正的做好接口测试&#xff0c;并且弄懂如何测试接口&#xff0c;需要从如下几…

Vue2项目练手——通用后台管理项目第一节

Vue2项目练手——通用后台管理项目 知识补充yarn和npm区别npm的缺点&#xff1a;yarn的优点 npm查看镜像和设置镜像 项目介绍项目的技术栈 项目搭建文件目录 创建路由&#xff0c;引入element-uirouter/index.jsmain.jspages/Users.vuepages/Main.vuepages/Home.vuepages/Login…

启迪未来:学乐多光屏P90引领儿童智能学习革命

在当今数字化时代&#xff0c;教育方式正经历着巨大的变革&#xff0c;智能硬件为教育领域带来了前所未有的机遇和挑战。学乐多光屏学习机作为一款创新的教育智能硬件产品&#xff0c;以其独特的特点和优势&#xff0c;引领着学习机领域的发展潮流。 1. 多功能融合&#xff1a;…

Android 基础知识

一、Activity 1、onSaveInstanceState(),onRestoreInstanceState的调用时机 onSaveInstanceState 调用时机 从最近应用中选择运行其他程序时 但用户按下Home键时 屏幕方向切换时 按下电源案件时 从当前activity启动一个新的activity时 onRestorInstanceState调用时机 只…

【线程同步】AQS抽象排队同步器(AbstractQueuedSynchronizer)

AQS(AbstractQueuedSynchronizer)抽象排队同步器 AbstractQueuedSynchronizer AQS就是AbstractQueuedSynchronizer类 AQS其实就是JUC包下的一个基类&#xff0c;JUC下的很多内容都是基于AQS实现了部分功能&#xff0c;比如ReentrantLock&#xff0c;ThreadPoolExecutor&#…

用变压器实现德-英语言翻译【01/8】:嵌入层

一、说明 本文是“用变压器实现德-英语言翻译”系列的第一篇文章。它引入了小规模的嵌入来建立感知系统。接下来是嵌入层的变压器使用。下面简要概述了每种方法&#xff0c;然后是德语到英语的翻译。 二、技术背景 嵌入层的目标是使模型能够详细了解单词、标记或其他输入之间的…

实验室的服务器和本地pycharm怎么做图传

参考 远程调试 qt.qpa.xcb: could not connect to display, echo DISPLAY为空[已解决]_功夫小象的博客-CSDN博客 先安装x11 MobaXterm x11-forwarding_C--G的博客-CSDN博客 我是在容器中搞得 1&#xff0c;安装qt5 pip install PyQt5 -i https://pypi.douban.com/simple …

登录页面设计的7个小细节,帮你提升用户体验

移动 APP 登录页面的设计直接影响到用户体验&#xff0c;从而决定 APP 的成败。我们应该设计出令用户兴奋而不是沮丧的登录界面。下面就让我和你分享几个提升登录页面 UX 设计的技巧: 如果用户必须登录才能使用服务&#xff0c;那么需要仔细考虑登录表单。 在构建登录页面设计…

Nuxt3打包部署到Linux(node+pm2安装和运行步骤+nginx代理)

最近&#xff0c;我们项目组的工作接近尾声&#xff0c;需要把项目部署上线。由于前端第一次使用Nuxt3框架&#xff0c;后端也是第一次部署Nuxt3项目&#xff0c;所以刚开始出现了很多问题。在我上网搜索很多教程后&#xff0c;得到了基本的流程。 1.服务器安装node.js环境 N…

华为鲲鹏服务器

1.简介 鲲鹏通用计算平台提供基于鲲鹏处理器的TaiShan服务器、鲲鹏主板及开发套件。硬件厂商可以基于鲲鹏主板发展自有品牌的产品和解决方案&#xff1b;软件厂商基于openEuler开源OS以及配套的数据库、中间件等平台软件发展应用软件和服务&#xff1b;鲲鹏开发套件可帮助开发…

深入解析SNMP协议及其在网络设备管理中的应用

SNMP&#xff08;Simple Network Management Protocol&#xff0c;简单网络管理协议&#xff09;作为一种用于网络设备管理的协议&#xff0c;在实现网络设备的监控、配置和故障排除方面发挥着重要的作用。本文将深入解析SNMP协议的工作原理、重要概念和功能&#xff0c;并探讨…

C++自创题目——第一期

一、题目描述&#xff1a; 在一段时间内&#xff0c;到达港口的船有n艘&#xff0c;其中每艘船的信息包括:到达时间t(表示第t秒)&#xff0c;船上乘客数k&#xff0c;以及k名乘客的国籍。输出前3600s内每艘船上国籍种数&#xff0c;并输出国籍种数最少的船只的到达时间。 二、…

docker使用harbor进行镜像仓库管理演示以及部分报错解决

目录 一.安装harbor和docker-compose 1.下载 2.将该文件修改为这样&#xff0c;修改好自己的hostname和port&#xff0c;后文的用户和密码可以不改也可以改&#xff0c;用于登录 3.安装 二.修改daemon.json文件和/etc/hosts文件 三.使用powershell作windows端域名映射 四…

【ArcGIS Pro二次开发】(63):批量更改字段别名

在我工作中遇到的大多数图斑&#xff0c;字段名称一般是英文&#xff0c;字段别名是中文&#xff0c;使用起来是比较方便的。 但有时候也会遇到一些不一样的情况&#xff0c;不知是经过了怎样的处理&#xff0c;图斑的字段别名被修改成了和字段名称一样的英文&#xff0c;这样…

[JAVA学习笔记]常用类

String类&#xff1a; 一、存放位置&#xff1a; 字符串对象创建好后不能修改 String是引用数据类型&#xff0c;但是这里作为方法参数传递的时候&#xff0c;效果跟基本数据类型是一样的。也就是说在堆中创建出来的字符串”monkey”是不能被改变的&#xff0c;如果…

ThinkPHP 资源路由的简单使用,restfull风格API

ThinkPHP 资源路由的简单使用&#xff0c;restfull风格API 一、资源控制器二、资源控制器简单使用 一、资源控制器 资源控制器可以轻松的创建RESTFul资源控制器&#xff0c;可以通过命令行生成需要的资源控制器&#xff0c;例如生成index应用的TestR资源控制器使用&#xff1a…

cyclictest stress 工具 使用

工具介绍 1. Cyclictest 准确且重复地测量线程的预期唤醒时间与它实际唤醒的时间之间的差异&#xff0c;以提供有关系统延迟的统计数据。 它可以测量由硬件、固件和操作系统引起的实时系统延迟 2.stress是Linux的一个压力测试工具&#xff0c;可以对CPU、Memory、IO、磁盘进行…