Day8 字符串
Day8 字符串
反转字符串
双指针
class Solution {
public void reverseString(char[] s) {
//反转字符串,双指针反转数组即可
int left = 0;
int right = s.length - 1;
while (left < right) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
反转字符串II
在遍历字符串的过程中,只要让 i += (2 k),i 每次移动 2 k 就可以了,然后判断是否需要有反转的区间。
所以当需要固定规律一段一段去处理字符串的时候,要想想在for循环的表达式上做做文章。
class Solution {
/**
* 反转字符串中的部分字符
*
* @param s 输入字符串
* @param k 反转的间隔参数
* @return 处理后的字符串
*/
public String reverseStr(String s, int k) {
// 将字符串转换为字符数组以便原地修改
char[] ch = s.toCharArray();
// 遍历字符串,每次步进2k个字符
for (int i = 0; i < ch.length; i += 2 * k) {
// 情况1: 剩余字符足够k个,反转前k个字符
if (i + k <= ch.length) {
reverse(ch, i, i + k - 1);
}
// 情况2: 剩余字符不足k个,反转所有剩余字符
else {
reverse(ch, i, ch.length - 1);
}
}
// 将字符数组转换回字符串并返回
return new String(ch);
}
/**
* 反转字符数组中指定范围的字符
*
* @param ch 字符数组
* @param start 起始索引(包含)
* @param end 结束索引(包含)
*/
private void reverse(char[] ch, int start, int end) {
// 使用双指针法反转指定范围内的字符
while (start < end) {
// 交换首尾字符
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
// 移动指针
start++;
end--;
}
}
}