一、反转字符串
利用双指针和 一个临时变量解决(因为左右指针无法直接交换)
二、反转字符串二
基于反转字符一,这里叙述一下i的含义
for (int i = 0; i < n; i += 2 * k) {
reverse(arr,i,Math.min(i+k, n) - 1);
}
- i对应的是每个2k区间中的左指针,而Math.min(i+k,n) - 1则是右指针
- 每次遍历剩余字符数量是 >2k ; <= 2k && > k ; <k 三种情况,前两种情况的处理方式相同,唯一不同的就是 <k 的情况,小于k,对应的 左指针 + k > 字符数组末尾,那么此时取最小值n来作为右指针刚好遍历完成
三、卡码网:54替换数字
大家第一步想到的都是转换成字符数组,但是字符数组进行更改起来就比较麻烦
这里推荐StringBuilder,一个可变的字符串对象StringBuffer & StringBuilder
通过遍历来字符数组对应情况对应添加number还是原字符
public static String replaceDigits(String s) {
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
if (Character.isDigit(c)) {
sb.append("number");
} else {
sb.append(c);
}
}
return sb.toString();
}
四、翻转字符串里的单词
需要解决的问题:两侧空格,单词之间多个空格,反转单词
参考链接151. k神的解题思路
关键点是K神将 反转 转换为 倒序,这个思路很重要,决定了倒序遍历,并遍历后不需要其他操作直接添加到StringBuffer提高效率
- 这里的双指针是用来限定某个单词的 i为左侧,j为右侧
- 因为每次添加单词后都会拼接一个空格(" "),所以最后trim()是为了清除最后一个单词后的空格
class Solution {
public String reverseWords(String s) {
s = s.trim(); // 删除首尾空格
int j = s.length() - 1, i = j;
StringBuilder res = new StringBuilder();
while (i >= 0) {
while (i >= 0 && s.charAt(i) != ' ') i--; //1 搜索首个空格
res.append(s.substring(i + 1, j + 1) + " "); // 添加单词
while (i >= 0 && s.charAt(i) == ' ') i--; //2 跳过单词间空格
j = i; // j 指向下个单词的尾字符
}
return res.toString().trim(); // 转化为字符串并返回
}
}
五、卡码网:55右旋转字符串
利用双指针即可解决
public static void reverse(char[] charArray, int start, int end) {
for (; start < end; start++, end--) {
char tmp = charArray[start];
charArray[start] = charArray[end];
charArray[end] = tmp;
}
}