Leetcode344.反转字符串
注意:√
- 双指针,没啥可操作的
public void reverseString(char[] s) {
int left = 0;
int right = s.length-1;
while (left<right){
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
System.out.println(s);
}
Leetcode541. 反转字符串 II
注意:√
- 注意char[]转String的方法
- 可以使用new String
- 也可以使用String.valueof
public String reverseStr(String s, int k) {
char[] ss = s.toCharArray();
int i = 0;
int left = 0 + i * k;
int right;
if (k - 1 + i * k >= ss.length) {
right = ss.length - 1;
} else {
right = k - 1 + i * k;
}
while (left < ss.length) {
while (left < right) {
char temp = ss[left];
ss[left] = ss[right];
ss[right] = temp;
left++;
right--;
}
i = i + 2;
left = 0 + i * k;
if (left < ss.length && k - 1 + i * k > ss.length) {
right = ss.length - 1;
} else {
right = k - 1 + i * k;
}
}
return new String(ss);
}
卡码网:54.替换数字
注意:√
- 。。。。
Leetcode151.翻转字符串里的单词
注意:×
- 原本解决办法很简单,但是要求在原数组上改的话就需要操作一下
- 操作如下图所示:来源代码随想录
//解法二:创建新字符数组填充。时间复杂度O(n)
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);
}
}
}
卡码网:55.右旋字符串
注意:×
- 原本思路就是O(n)操作,创建新的数组,拿出来以后移动再放回去
- 下图的操作很有意思,先整体翻转再局部翻转就可以得到结果
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.parseInt(in.nextLine());
String s = in.nextLine();
int len = s.length(); //获取字符串长度
char[] chars = s.toCharArray();
reverseString(chars, 0, len - n - 1); //反转前一段字符串,此时的字符串首尾是0,len - n - 1
reverseString(chars, len - n, len - 1); //反转后一段字符串,此时的字符串首尾是len - n,len - 1
reverseString(chars, 0, len - 1); //反转整个字符串
System.out.println(chars);
}
public static void reverseString(char[] ch, int start, int end) {
//异或法反转字符串,参照题目 344.反转字符串的解释
while (start < end) {
ch[start] ^= ch[end];
ch[end] ^= ch[start];
ch[start] ^= ch[end];
start++;
end--;
}
}