LeetCode 反转字符串

72 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第10天,点击查看活动详情

一、题目描述:

344. 反转字符串 - 力扣(LeetCode)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

 

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

提示:

  • 1 <= s.length <= 10^5
  • s[i] 都是 ASCII 码表中的可打印字符

二、思路分析:

反转字符串,设置两个指针,一个开始,一个结束,当数组的长度为0的时候,返回空数组,不为0的额时候,当开始的指针小于结束的指针时候,开始遍历,交换两侧的数组值。 注:之所以要length-1 是因为,数组的索引值是从0开始的,而length长度是从1开始计算的,长度减1就是索引值了。不减去1的话,数组的索引值长度大于实际长度,数组最后一个将是undefined

三、AC:

class Solution {
    public String reverseStr(String s, int k) {
        char[] a = s.toCharArray();
        for (int start = 0; start < a.length; start += 2 * k) { //每2k个就进行判断
            int i = start; //确定开始位置
            //确定反转边界,若剩余字符大于k,则j = start + k - 1,反转前k个
            //小于k时,start再加k减一就会大于或等于字符串长度-1,则此时j = a.length - 1,剩余字符全部反转
            int j = Math.min(start + k - 1, a.length - 1);
            while (i < j) {
                char tmp = a[i];
                a[i++] = a[j];
                a[j--] = tmp;
            }
        }
        return new String(a);
    }
}

参考

字符反转-》字符交换-》双指针:前后交换,终止条件 左<=右 - 反转字符串 - 力扣(LeetCode)

因为数组所有值都可以用ASCII码表示,所以可以用异或运算交换,提高速度 - 反转字符串 - 力扣(LeetCode)