目录
力扣.5.最长回文子串
力扣.14最长公共前缀
力扣219.存在重复元素II
力扣.67二进制求和
力扣.5.最长回文子串
中心拓展算法,假设以i位置为中心两边可以扩展到多少,所以当对应一个中间位置的时候,可以定义两个指针,对应一个前和一个后,然后中心扩展面临的问题就是可能回文是奇数,可能是偶数,所以需要进行两次中心扩展,
class Solution {public String longestPalindrome(String s) {//中心拓展算法int n=s.length();char[]a=s.toCharArray();String c="";int max=0;for(int i=0;i<n;i++){int left=i-1;int right=i+1;while(left>=0&&right<n){if(a[left]==a[right]){left--;right++; }else{break;}}if(right-left-1>max){c=s.substring(left+1,right);max=right-left-1;}left=i;right=i+1;while(left>=0&&right<n){if(a[left]==a[right]){left--;right++; }else{break;}}if(right-left-1>max){c=s.substring(left+1,right);max=right-left-1;}}return c;} }
力扣.14最长公共前缀
我起初的想法十分混乱,压根没往什么两个比较上想,我还是想用哈希表统计次数,但是越统计发现糊涂,有点懵了,(然后看是简单题,我就这么一个调试,快完事了后,告诉我,最后几个用例过不去,直接放弃看题解的思路,没想到这么简单,说个思路就写出来了。
可以定义一个指针,相同的情况右移动,相同右移动,蛮考验代码实力
class Solution { public static String longestCommonPrefix(String[] strs) {int []hash=new int[26];int n=strs.length;//两个两个比较String common=strs[0];for(int i=1;i<n;i++) {char[]a=common.toCharArray();String ret="";char[] b = strs[i].toCharArray();for (int j = 0; j < Math.min(b.length, a.length); j++) {if (a[j] == b[j]) {ret += a[j];} else {break;}}common=ret;}return common; } }
这个解法的优化代码版本:思路是一致的
class Solution {public String longestCommonPrefix(String[] strs) {//两个两个比较String ret=strs[0];//先记录第一个字符串,然后依次比较即可for(int i=1;i<strs.length;i++){ret=findCommon(strs[i],ret);}return ret;}public String findCommon(String s1,String s2){int i=0; //记录后统计i的位置,然后如果s1和s2相等,i往后移动while(i<Math.min(s1.length(),s2.length())&&s1.charAt(i)==s2.charAt(i))i++; //这样就返回0-i位置的字符串return s1.substring(0,i);} }
解法二:统一比较,就是我上面的那个最初想法,但是还略微不同
class Solution {public static String longestCommonPrefix(String[] strs) {int []hash=new int[26];int n=strs.length;//两个两个比较String common="";int min=9999;int count=0;for(int i=0;i<n;i++){min=Math.min(min,strs[i].length());}for(int j=0;j<min;j++){char[]a=strs[0].toCharArray();char tmp=a[j];for(int i=0;i<n;i++){char[]b=strs[i].toCharArray();if(tmp!=b[j]){count=1;break;}}if(count==1){break;}common+=tmp;}return common;} }
力扣219.存在重复元素II
使用哈希表的同时我们还需要注意,他的存储下标,假如她出现第二种情况
1 0 1 1,当我们发现重复元素,看他是不是满足<=k,假如满足直接返回k,假如不满足,我们默认更新后面的重复值,因为假如后面还有重复值,那肯定是离他最近的相同的元素,是我们这个想更新的元素,而不是最远的那个,因为我们是想返回true,那肯定先找能满足这个小于的情况的(意思就是找近的)。
class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {HashMap<Integer,Integer>a=new HashMap<>();for(int i=0;i<nums.length;i++){if(!a.containsKey(nums[i])){a.put(nums[i],i);}else{if(Math.abs(a.get(nums[i])-i)<=k) return true;a.put(nums[i],i);}}return false;}
}
力扣.67二进制求和
这个代码感觉有点冗余,就是典型的莽夫算法
class Solution {//a和b两个字符串,我们想要求出两个的和public static String addBinary(String a, String b) {char[]aa=a.toCharArray();char[]bb=b.toCharArray();int i=aa.length-1;int j=bb.length-1;StringBuffer ret=new StringBuffer();int count=0;while(i>=0&&j>=0) {//两个都是1,然后进位有一个0if(aa[i]=='1'&&bb[j]=='1'&&count==0){ret.append(0);count++;}//两个1,并且进位是1else if(aa[i]=='1'&&bb[j]=='1'&&count==1){ret.append(1);}//假如说有一个为0,一个为1的情况,进位为1else if((aa[i]=='1'||bb[j]=='1')&&count==1){ret.append(0);}else if((aa[i]=='1'||bb[j]=='1')&&count==0){ret.append(1);}//两个都是0的情况else if(aa[i]=='0'&&bb[j]=='0'&&count==0){ret.append(0);}else if(aa[i]=='0'&&bb[j]=='0'&&count==1){count--;ret.append(1);}i--; j--;}while(i>=0){//两个都是1,然后进位有一个0if(aa[i]=='1'&&count==0){ret.append(1);}//两个1,并且进位是1else if(aa[i]=='1'&&count==1){ret.append(0);}else if(aa[i]=='0'&&count==1){count--;ret.append(1);}else if(aa[i]=='0'&&count==0){ret.append(0);}i--;}while(j>=0){//两个都是1,然后进位有一个0if(bb[j]=='1'&&count==0){ret.append(1);}//两个1,并且进位是1else if(bb[j]=='1'&&count==1){ret.append(0);}else if(bb[j]=='0'&&count==1){count--;ret.append(1);}else if(bb[j]=='0'&&count==0){ret.append(0);}j--;}if(count==1){ret.append(count);count--;}return ret.reverse().toString();}
}
实际上高精度是想考