今天状态不佳,写题脑子的速度明显没跟上。
看了一遍解法后自己打了一遍
class Solution {
public String reverseStr(String s, int k) {
char[] ss = s.toCharArray(); //把字符串变为字符数组的形式,这样子方便处理
for(int i =0;i<ss.length;i+=2*k){
int start = i;
if(start+k<=ss.length-1) {
reverse(ss,start,start+k-1);
continue;
}
reverse(ss,start,ss.length-1); //在这里的索引位置经常出错,要注意
}
return new String(ss); //在这里把ss这个字符数组变为字符串
}
public void reverse(char[] t,int start,int right) {
char temp;
for(;start<right;start++,right--){
temp = t[start];
t[start] = t[right];
t[right] =temp;
}
}
}
151做了两天,看解答看了两天才做出来,而且还是不是自己看后打的,二刷需要多加强一遍。二刷如果还不会,就三刷四刷,直到会为止。
class Solution {
/**
* 思路:
* ①反转字符串 "the sky is blue " => " eulb si yks eht"
* ②遍历 " eulb si yks eht",每次先对某个单词进行反转再移位
* 这里以第一个单词进行为演示:" eulb si yks eht" ==反转=> " blue si yks eht" ==移位=> "blue si yks eht"
*/
public String reverseWords(String s) {
//步骤1:字符串整体反转(此时其中的单词也都反转了)
char[] initialArr = s.toCharArray();
reverse(initialArr, 0, s.length() - 1);
int k = 0;
for (int i = 0; i < initialArr.length; i++) {
if (initialArr[i] == ' ') {
continue;
}
int tempCur = i;
while (i < initialArr.length && initialArr[i] != ' ') {
i++;
}
for (int j = tempCur; j < i; j++) {
if (j == tempCur) { //步骤二:二次反转
reverse(initialArr, tempCur, i - 1);//对指定范围字符串进行反转,不反转从后往前遍历一个个填充有问题
}
//步骤三:移动操作
initialArr[k++] = initialArr[j];
if (j == i - 1) { //遍历结束
//避免越界情况,例如=> "asdasd df f",不加判断最后就会数组越界
if (k < initialArr.length) {
initialArr[k++] = ' ';
}
}
}
}
if (k == 0) {
return "";
} else {
//参数三:以防出现如"asdasd df f"=>"f df asdasd"正好凑满不需要省略空格情况
return new String(initialArr, 0, (k == initialArr.length) && (initialArr[k - 1] != ' ') ? k : k - 1);
}
}
public void reverse(char[] chars, int begin, int end) {
for (int i = begin, j = end; i < j; i++, j--) {
chars[i] ^= chars[j];
chars[j] ^= chars[i];
chars[i] ^= chars[j];
}
}
}