L0344. 反转字符串
思路分析
本题如果使用暴力方法的话就是把整个string转成char数组,然后再倒着遍历出来,但是题目中的描述是必须原地修改输入数组,这时其实可以想到用指针的做法实现,也就是使用左右两个指针进行首尾的交换。
代码实现
得到这个思路之后代码实现就已经很简单了。
public void reverseString(char[] s) {
int left = 0;
int right = s.length - 1;
char temp;
while(left < right){
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
L0541. 反转字符串 II
思路分析
在上一题中,其实也是翻转left和right之间的字符串,只不过上面的题目的left和right正好是边界。
这一题本来想用双指针每次left和right移动2*k的长度,但是移动之后还要判断剩下的长度。看了题解发现,学习到了一种新的for循环的方式。
代码实现
这里每次for循环的时候,不再是i++,而是直接加上一个步长。
public String reverseStr(String s, int k) {
int n = s.length();
char[] chars = s.toCharArray();
for (int i = 0; i < n; i += 2 * k) {
reverseString(chars, i, Math.min(i + k, n) - 1);
}
return new String(chars);
}
// 反转left到right范围内的字符串
public void reverseString(char[] s, int left, int right) {
char temp;
while (left < right) {
temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
54. 替换数字
思路分析
本题是卡码网的题目,具体的代码实现思路不算麻烦,使用ASCLL码的特点,依次遍历字符串中的每一个字符,当 'c' - 0 < 10 的时候,说明c一定是数字字符,对齐进行替换即可。
代码实现
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String inputString = scanner.nextLine();
replace(inputString);
}
public static void replace(String s) {
String number = "number";
char[] chars = s.toCharArray();
StringBuilder stringBuilder = new StringBuilder();
for (char c:
chars) {
if ((c-'0')<10){
stringBuilder.append(number);
}
else {
stringBuilder.append(c);
}
}
System.out.println(stringBuilder);
}
L0151. 反转字符串中的单词
思路分析
个人思路就是把整个长字符串用空格分开,然后对拆开的字符串进行翻转。需要注意因为存在多个空格所以直接拆开之后的字符串存在一些问题。
String S = " A BB CCC DDDD ";
String[] s = S.split(" ");
System.out.println(Arrays.toString(s));
输出的结果为
[, A, BB, , CCC, , , DDDD]
可以看到切割之后的字符串数组会有问题:①有空串 ②字串前可能有空格 ③字串后可能有空格。
所以需要在遇到空串时进行跳过,同时在对每个字串进行翻转前进行处理。
代码实现
public String reverseWords(String s) {
String[] strings = reverseWordsFun(s);
StringBuilder stringBuilder = new StringBuilder();
for (String ss : strings) {
if (ss.length() > 0) {
stringBuilder.append(deleteSpaces(ss));
stringBuilder.append(" ");
}
}
stringBuilder.deleteCharAt(stringBuilder.length() -1);
return stringBuilder.toString();
}
public String deleteSpaces(String s) {
int left = 0, right = s.length() - 1;
// 去掉字符串开头的空白字符
while (left <= right && s.charAt(left) == ' ') {
++left;
}
// 去掉字符串末尾的空白字符
while (left <= right && s.charAt(right) == ' ') {
--right;
}
return s.substring(left, right + 1);
}
public String[] reverseWordsFun(String s) {
String[] words = s.split(" ");
int left = 0;
int right = words.length - 1;
String temp = "";
while (left < right) {
while (left < right && words[left].isEmpty()) {
left++;
}
// 移动 right 指针直到找到一个非空字符串为止
while (left < right && words[right].isEmpty()) {
right--;
}
temp = words[left];
words[left] = words[right];
words[right] = temp;
left++;
right--;
}
return words;
}