算法
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--;
}
}
}
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;
//算一下够不够2k
int 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);
}
}
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;
}
}
}
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+树的区别
什么是聚集索引和非聚集索引