字符串——344,541

字符串章节类似于数组章节,但是又有略微不同。今天的题目分别是LeetCode.344反转字符串LeetCode.541反转字符串Ⅱ

LeetCode.344反转字符串

反转字符串
对于本题,如果仔细学习和思考了代码随想录前面的内容,并且结合题目描述,空间复杂度为O(1),是比较容易想到解决办法的。在看到这道题的时候,第一反应会想到使用双指针法,进而思考使用快慢指针还是使用对撞指针,因为本题需要我们反转字符串,将最前面和最后面的元素进行互换,然后向中心靠近,继续互换,所以自然而然想到对撞指针。

	public static void reverseString(char[] s){
        for (int i = 0,j=s.length-1; i < s.length/2; i++;j--) {
            char temp=s[i];
            s[i]=s[j];
            s[j]=temp;
        }
    }

本题代码十分简洁。主要思路是,一个指针指向第一个元素,另一个指向最后一个元素,将其互换后,将两个指针分别向中间移动,继续互换,重复该操作。注意的点有三个,分别是循环条件,奇偶区分,以及for循环的写法。第一点,循环条件。这里的循环条件到数组长度一半处就可以停止,如果到数组末尾再结束,会将数组元素交换两遍,最后将返回原数组。第二点,奇偶的区分。这里其实可以不用特别区分数组长度是奇数还是偶数,因为如果数组元素有偶数个,刚好可以两两交换,如果数组元素为奇数个,那么两两交换剩下最中间那个元素,交换之后那个位置仍为该元素,所以该位置的元素交换与否并不重要。第三点是for循环的写法,注意多个变量时的写法。

LeetCode541.反转字符串Ⅱ

反转字符串Ⅱ
本题有点像上一道题,但是在上一道题的基础上,添加了很多新的要求。在第一次看这道题目的时候,我按照题干模拟了一遍,但是提交代码后有一个测试用例没有通过,那个测试用例字符串较长,k的值也较大,导致我也没办法去调试找问题。之后在看过本题的评论和讲解后,彻底明白本题的意思:反转k个,跳过k个,或者说每隔k个反转k个,最后不足k个全部反转

	public static String revs(String s,int start,int end){
        char[] chars =s.toCharArray();
        for (int i = start,j=end; i <=(start+end)/2 ; i++,j--) {
            char temp=chars[i];
            chars[i]=chars[j];
            chars[j]=temp;
        }
        return new String(chars);
    }
    
    public static String reverseStr(String s,int k){
        for (int i = 0; i < s.length(); i=i+2*k) {
            if (s.length()-i<k) {
                s=revs(s,i,s.length()-1);
            }else {
                s=revs(s, i, i + k-1);
            }
        }
        return s;
    }

这里一共定义了两个函数,第一个用于字符串的翻转,第二用于实现翻k跳k的逻辑。在revs()函数中,代码逻辑和上一题几乎完全一样,不过这里另外添加了反转起点和反转终点,我习惯的是左闭右闭的区间,所以就是反转时包括start和end。reverseStr()函数中,注意for循环中的表达式,因为翻k后需要跳k,所以一翻一跳为一次循环。在每次循环后需要判断是否不足k个,如果不足k个,将end参数设置为数组最后一个元素的下标。如果不是,则注意数组下标的对应,可以适当举一些实例来辅助思考。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值