1.题目:344 反转字符串
解题思路:
位运算:
s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];
代码实现
class Solution {
public void reverseString(char[] s) {
int i= 0;
int j=s.length-1;
while(i < j){
char temp = s[i];
s[i] = s[j];
s[j] = temp;
i++;
i--;
}
}
}
补充
2.题目:541 反转字符串Ⅱ
解题思路:
题目含义: k=2 的话 abcde 变成 ba cde
abcdefg 变成ba cd fe g (不足2K时反转前K个 )
代码实现
class Solution {
public String reverseStr(String s, int k) {
int n = s.length();
char[] ch = s.toCharArray();
for(int i = 0;i < ch.length;i += 2 * k){
int start = i;
// 判断尾数够不够k个来取决end指针的位置
int end = Math.min(ch.length - 1,start + k - 1);
while(start < end){
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start++;
end--;
}
}
return new String(ch);
}
}
补充
3.题目:151.翻转字符串里的单词
解题思路:
- 移除多余空格(使用双指针法来去移除空格)
- 将整个字符串反转
- 将每个单词反转
代码实现
class Solution {
public String reverseWords(String s) {
//源字符数组
char[] initialArr = s.toCharArray();
//新字符数组
char[] newArr = new char[initialArr.length+1];//下面循环添加"单词 ",最终末尾的空格不会返回
int newArrPos = 0;
//i来进行整体对源字符数组从后往前遍历
int i = initialArr.length-1;
while(i>=0){
while(i>=0 && initialArr[i] == ' '){i--;} //跳过空格
//此时i位置是边界或!=空格,先记录当前索引,之后的while用来确定单词的首字母的位置
int right = i;
while(i>=0 && initialArr[i] != ' '){i--;}
//指定区间单词取出(由于i为首字母的前一位,所以这里+1,),取出的每组末尾都带有一个空格
for (int j = i+1; j <= right; j++) {
newArr[newArrPos++] = initialArr[j];
if(j == right){
newArr[newArrPos++] = ' ';//空格
}
}
}
//若是原始字符串没有单词,直接返回空字符串;若是有单词,返回0-末尾空格索引前范围的字符数组(转成String返回)
if(newArrPos == 0){
return "";
}else{
return new String(newArr,0,newArrPos-1);
}
}
}
补充
今日总结
- 需要重复观看,在反复一遍