算法day07-字符串篇(1)
目录
- 344 反转字符串
- 反转字符串II
- 替换数字
一、反转字符串
本题要求原地反转字符串,即不使用额外空间修改 char[] s
中的字符顺序。考虑使用双指针法:
-
定义两个指针
left
和right
,分别指向字符串的两端; -
依次交换
s[left]
与s[right]
,并将指针向中间靠拢(left++
,right--
); -
当两个指针相遇或交错时,说明反转完成。
这种方式可以实现 原地反转,不需要额外空间,效率也很高。
class Solution { public void reverseString(char[] s) { int left = 0, right = s.length-1; while(left < right){ char tmp = s[left]; s[left] = s[right]; s[right] = tmp; left++; right--; } } } //时间复杂度:O(N) //空间复杂度:O(1)
二、反转字符串II
题目要求每隔 2k
个字符就反转前 k
个字符,剩下的部分按规则处理。可以直接对原字符串转为字符数组,在原地进行操作。
-
每次以
i
为起点,步长为2k
,处理长度为2k
的块; -
对每一块的前
k
个字符进行反转; -
为避免越界,右边界需取
Math.min(i + k - 1, s.length - 1)
; -
用双指针
left
和right
进行字符交换,实现局部反转; -
最终将修改后的字符数组转回字符串返回。
public String reverseStr(String s, int k) { char[] arr = s.toCharArray(); for (int i = 0; i < arr.length; i += 2 * k) { int left = i; int right = Math.min(i + k - 1, arr.length - 1); while (left < right) { char tmp = arr[left]; arr[left++] = arr[right]; arr[right--] = tmp; } } return new String(arr); }
三、替换数字
遍历整个字符串,对于每个字符进行判断:
-
如果是数字字符(如 '0'~'9'),就将其替换为
"number"
; -
如果是小写字母字符(如 'a'~'z'),就直接保留;
-
最后将所有结果拼接为一个新的字符串返回。
class Main{ public static void main(String[] args){ Scanner in = new Scanner(System.in); String s = in.nextLine(); StringBuilder sb = new StringBuilder(); for(char c : s.toCharArray()){ if(c >='0' && c<='9'){ sb.append("number"); }else{ sb.append(c); } } System.out.print(sb); } } //时间复杂度:O(N) //空间复杂度:O(N)