力扣-->#344+#541.反转字符串I+II -->字符串-简单(双指针、模拟)

题1. 344. 反转字符串 - 力扣(LeetCode) (leetcode-cn.com)

题目描述:
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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 <= 105
s[i] 都是 ASCII 码表中的可打印字符

这道题比较简单,但也容易出错,基本思路都比较清晰,容易想到。
注意点:
1.关于for循环的特殊使用,用得少,但不能忘;
2.双指针的使用,常用在链表反转等与反转有关的题目上,对此需要熟练的立即反应。

执行结果:通过
执行用时:1 ms, 在所有 Java 提交中击败了92.95%的用户
内存消耗:44.6 MB, 在所有 Java 提交中击败了94.75%的用户
通过测试用例:477 / 477

双指针法:

class Solution {
    public void reverseString(char[] s) {
        char temp;
        for(int left=0,right=s.length-1;left<right;left++,right--){
            temp=s[left];
            s[left]=s[right];
            s[right]=temp;
        }
    }
}

题2.541. 反转字符串 II - 力扣(LeetCode) (leetcode-cn.com)

题目描述:
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

 示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例 2:
输入:s = "abcd", k = 2
输出:"bacd"

提示:
1 <= s.length <= 10^4
s 仅由小写英文组成
1 <= k <= 10^4

这道题的难点在于理清满足哪些条件的时候才需要反转哪些字符:即反转每次下标从2k的倍数开始,长度为k的字符,若字符串长度不足k,则全部反转,其余情况不需反转,无需处理。所以解题时关键在于对上述条件下的字符进行反转。

执行结果:通过
执行用时:1 ms, 在所有 Java 提交中击败了63.06%的用户
内存消耗:38.3 MB, 在所有 Java 提交中击败了82.92%的用户
通过测试用例:60 / 60

模拟法:

class Solution {
    public String reverseStr(String s, int k) {
        int n=s.length();
        char[] arr=s.toCharArray();
        for(int i=0;i<n;i+=2*k){
            //Math.min(i+k,n)返回i+k与n中较小的那个数,少于k个直接反转
            reverse(arr,i,Math.min(i+k,n)-1);
        }
        return new String(arr);
    }

    //将第i到k+i个字符反转(也就是每次反转传进来的前k个数值)
    //调用到最后,剩下的字符不管他,满足题给的条件2
    public void reverse(char[] arr,int left,int right){
        while(left<right){
            char temp=arr[left];
            arr[left]=arr[right];
            arr[right]=temp;
            left++;
            right--;
        }
    }
}

平平无奇小白程序媛一枚,欢迎各位大佬交流指教,如有不正确的地方,欢迎留言改正,谢谢!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值