Day8 字符串

12

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--;
        }
    }
}