第四章字符串-part01,知识点为反转字符串、双指针。
344. 反转字符串
1.1 解题过程
String是不可变对象,而StringBuilder是可变对象,reverse()要求原地修改,所以这行代码等价于本题的实现:1 2
| StringBuilder sb = new StringBuilder(String.valueof(s)).reverse(); String newStr = sb.toString();
|
1 2 3 4 5 6 7 8 9 10 11
| class Solution { public void reverseString(char[] s) { int i = 0; int j = s.length - 1; while(i < j) { char tmp = s[i]; s[i++] = s[j]; s[j--] = tmp; } } }
|
541. 反转字符串II
2.1 解题过程
- 当需要以固定规律一段一段去处理字符串时,要想想for循环,在遍历字符串时,让
i += 2 * k,然后判断是否有需要反转的区间。 - 也属于双指针的题目,因为有交换操作。之前做的原地反转链表题也是哦。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| class Solution { public void reverse(char[] arr, int left, int right) { while(left < right) { char tmp = arr[left]; arr[left++] = arr[right]; arr[right--] = tmp; } }
public String reverseStr(String s, int k) { char[] str = s.toCharArray(); int n = str.length; for (int i = 0; i < n; i += 2 * k) { reverse(str, i, Math.min(i + k, n) - 1); } return String.valueOf(str); } }
|
卡码网:54.替换数字
3.1 解题过程
- 看作业提示,还不明白后序处理指什么,看了题解之后觉得还不错啊,又用到了双指针的思想。
- 具体来说,把本题作为一个数组填充类的问题,通常的做法是先预先给数组扩容到填充后的大小,然后在从后向前进行操作。好处是:
- 不用申请新数组。
- 从后往前填充,避免了从前往后填充时,每次要将添加元素之后的元素往后移动的问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| import java.util.Scanner;
public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String s = scanner.nextLine(); char[] str = s.toCharArray();
StringBuilder sb = new StringBuilder(); for (int i = 0; i < str.length; i++) { if (str[i] - 'a' >=0 && str[i] - 'a' < 26) { sb.append(str[i]); } else { sb.append("number"); } } System.out.println(sb.toString()); scanner.close(); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
| import java.util.Scanner;
public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String s = scanner.next(); int cntNum = 0; for (int i = 0; i < s.length(); i++) { if (Character.isDigit(s.charAt(i))) cntNum++; }
char[] newS = new char[s.length() + cntNum * 5]; System.arraycopy(s.toCharArray(), 0, newS, 0, s.length());
for (int i = newS.length - 1, j = s.length() - 1; i >= 0; ) { if (Character.isDigit(newS[j])) { System.arraycopy("number".toCharArray(), 0, newS, i - 5, 6); i -= 6; j--; } else { newS[i--] = newS[j--]; } } System.out.println(new String(newS)); } }
|
3.2 双指针小结
此时算上本题,我们已经做了7道双指针相关的题目了,分别是:
4. VScode使用
- 要一次性选中多行,
ctrl+shift+P,输入Toggle Column Selection Mode并执行,确保关闭此模式。 - 以上。学习时长: 2h