一.反转字符串II
1.题目链接
541. 反转字符串 II - 力扣(LeetCode)
2.思路
- 循环分组定位:使用
for
循环,每2k为一组。i
每次增加2k
,就相当于定位到下一组字符的起始位置。在每次循环中,确定当前组需要反转部分的起始索引start
(即当前循环的起始位置i
)和末尾索引end
。- 确定反转范围:用
Math.min(ch.length - 1, start + k - 1)
确定end
。 这是考虑到如果当前组的字符数不足k
个(接近字符串末尾时可能出现),就不能简单以start + k - 1
作为末尾索引,否则会越界。取ch.length - 1
和start + k - 1
中的较小值,就能保证确定的end
索引在合法范围内。
3.代码
class Solution {public String reverseStr(String s, int k) {char[]ch=s.toCharArray();for(int i=0;i<ch.length;i+=2*k){int start=i;int end=Math.min(ch.length-1,start+k-1);while(start < end){char temp = ch[start];ch[start] = ch[end];ch[end] = temp;start++;end--;}} return new String(ch);} }
二.替换数字
1.题目链接
54. 替换数字(第八期模拟笔试)
2.思路
统计数字个数:
创建新字符数组:
根据前面统计的数字个数count
,计算出替换后的字符串的长度(s.length() + count * 5
)。用于存储替换后的字符串内容。复制原始字符串内容:
从后向前替换数字:
采用从后向前遍历的方式处理新数组newS
。设置两个索引变量,一个指向新数组的末尾(newIndex = newSize - 1
),另一个指向原始字符串的末尾(i = s.length() - 1
)。
在遍历过程中,如果遇到数字字符(通过Character.isDigit(newS[i])
判断),就从新数组的当前位置开始,依次将 “number” 的字符逆序填入,同时将索引newIndex
向前移动 6 个位置(因为 “number” 有 6 个字符)。
如果遇到的不是数字字符,就直接将该字符复制到新数组的当前位置,并将newIndex
向前移动 1 个位置。返回结果:
3.代码
import java.util.Scanner;public class Main {public static String replaceNumber(String s) {
/1.统计单词个数int count = 0;for (int i = 0; i < s.length(); i++) {if (Character.isDigit(s.charAt(i))) {count++;}}
/2.创建新数组
/3.复制字符串内容到新数组中char[] newS = new char[s.length() + count * 5];int newSize = newS.length;System.arraycopy(s.toCharArray(), 0, newS, 0, s.length());
/4.从后往前替换数字int newIndex = newSize - 1;for (int i = s.length() - 1; i >= 0; i--) {if (Character.isDigit(newS[i])) {newS[newIndex--] = 'r';newS[newIndex--] = 'e';newS[newIndex--] = 'b';newS[newIndex--] = 'm';newS[newIndex--] = 'u';newS[newIndex--] = 'n';} else {newS[newIndex--] = newS[i];}}return new String(newS);}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);String s = scanner.next();System.out.println(replaceNumber(s));// 不建议在这种情况下关闭scanner,因为可能会影响后续输入操作// scanner.close();}
}