算法
344. 反转字符串
class Solution {public void reverseString(char[] s) {//拿一个中间变量来承载即可int l = 0;int r = s.length-1;while(l<r){char tmp = s[l];s[l] = s[r];s[r] = tmp;l++;r--;}}
}
541. 反转字符串 II
class Solution {public String reverseStr(String s, int k) {char[] cs = s.toCharArray();StringBuffer sb = new StringBuffer();int len = s.length();for(int i = 0;i<len;i+=2*k){int start = i;//算一下够不够2kint end = Math.min(start+k-1,len-1);while(start<end){char tmp = cs[start];cs[start] = cs[end];cs[end] = tmp;start++;end--;}}return new String(cs);}
}
151. 反转字符串中的单词
class Solution {/*** 不使用Java内置方法实现* <p>* 1.去除首尾以及中间多余空格* 2.反转整个字符串* 3.反转各个单词*/public String reverseWords(String s) {//去除空格StringBuilder sb = removeSpace(s);//翻转整个字符串reverseString(sb, 0, sb.length() - 1);//然后翻转各个单词reverseEachWord(sb);return sb.toString();}//去除空格public StringBuilder removeSpace(String s){//先去除前后空格int start = 0;int end = s.length() - 1;//如果为空就往前/后while(s.charAt(start) == ' ') start++;while(s.charAt(end) == ' ') end--;StringBuilder res = new StringBuilder();//此时去检测中间空格while(start <= end){char c = s.charAt(start);if(c != ' ' || c == ' ' && s.charAt(start-1) != ' '){res.append(c);}start++;}return res;}//翻转整个字符串public void reverseString(StringBuilder sb, int start, int end) {while (start < end) {char temp = sb.charAt(start);sb.setCharAt(start, sb.charAt(end));sb.setCharAt(end, temp);start++;end--;}}//翻转各个单词public void reverseEachWord(StringBuilder sb) {//用start来标记所有单词的起始位置int start = 0;//用end来记录所有单词的结束位置int end = 1;//记录最长int len = sb.length();while(end < len){//首先得找到每个单词,也就是先找到某个单词的结尾while(end<len && sb.charAt(end)!=' '){end++;}//找到结尾了就反转(传入下标)reverseString(sb,start,end-1);//去找下一个单词,在此之前需要跳过上一个单词与这一个单词的空格start = end + 1;end = start + 1;}}
}
459. 重复的子字符串
class Solution {public boolean repeatedSubstringPattern(String s) {int len = s.length();StringBuilder sb = new StringBuilder();//如果走到一半都没有找到,那么肯定无法构成for(int i = 0;i < len/2;i++){sb.append(s.charAt(i));if(len % sb.length() != 0){continue;}//拿tmp来去判断是否可以重复构成StringBuilder tmp = new StringBuilder(sb);//记录当前重复构成的子串String now = tmp.toString();while(tmp.length() <= len){if(tmp.length() == len && s.equals(tmp.toString())){return true;}else if(s.contains(tmp.toString())){//重复拼接子串tmp.append(now);}else{break;}}}return false;}
}
思考
这里针对昨天所做的一些题进行回顾一下,主要是两数之和,三数之和,四数之和。
这几道题其实思想都是类似的,挑选几个数,并且排序后就方便做的情况
那么难点其实就是在于去重以及每次选数来放到集合里面去。
其实四数之和就是多套了层的三数之和,我们最多同时操作两个数,那么考虑使用双指针的方法来做,即针对三数之和,就是先挑出一个,再挑两个;对于四数之和,就是现在挑出一个,再挑出一个,再挑两个。
补充知识点
今天补充的知识点有存储引擎和索引两方面的内容:
InnoDB如何解决幻读问题的?/ MySQL如何解决幻读问题的
B树和B+树的区别
什么是聚集索引和非聚集索引