蓝桥杯入门即劝退(二十二)反转字符(不走寻常路)

欢迎===关注===点赞===评论,共同学习,共同进步!

------持续更新蓝桥杯入门系列算法实例--------

如果你也喜欢Java和算法,欢迎订阅专栏共同学习交流!

你的点赞、关注、评论、是我创作的动力!

-------希望我的文章对你有所帮助--------

前言:今天来学习简单的字符串 处理算法,即简单的字符串反转,以及进阶版!简单易懂好上手!写技术性文章,最主要的是能让受众看懂,看明白,学得会!

一、题目描述 (1)

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 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、直接将字符串倒转,使用双指针,即可以从数组首位left和末位right进行交换位置,然后各自相向而行,双指针即可完成!

2、因此关键在于交换,C++库函数有swap,但是java没有,只能手写一个swap方法。

3、这里使用位运算来实现swap!

三、代码实现

  public void reverseString(char[] s) {
        int l = 0, r = s.length - 1;
        while (l < r) {
            s[l] ^= s[r];
            s[r] ^= s[l];
            s[l] ^= s[r];
            l++;
            r--;
        }
    }

 一、题目描述(2)

  给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

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

示例 2:

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

二、解题思路

1、本题类似于题1,也是需要对字符串进行反转,但是是进行局部反转

2、本题是对于前2k个字符中的前一半进行反转,而不是全部反转,注意!

3、使用双针针解法来完成,即firstk为前k个字符的位置,secondk为第2k个字符的位置。

4、我们首先把前k个字符串反转,再加入一个新的空字符串中,再接入后半不需要反转的字符串。

5、当剩余的部分不足k个直接就加入到最后即可!

6、注意两个指针的作用域都是小于length,且一个一次移动k,另一个移动2k,当两个指针相遇则结束循环!

三、代码实现

  public  static String reverseStr(String s, int k) {
        int len=s.length();
        int start=0;//起始位置
        StringBuffer res=new StringBuffer();//目标动态字符串
        while (start<len){
            StringBuffer sb=new StringBuffer();//临时字符串,每次都会改变
            int first=(start+k)>len?len:start+k;//三目运算符判断当前指针位置
            int second=(start+2*k)>len?len:start+2*k;

            sb.append(s.substring(start,first));//前一部分加入
            res.append(sb.reverse());//反转后再加入目标字符串
            if (first<second){
                res.append(s.substring(first,second));//无需反转直接加入
            }
            start+=2*k;
        }
        return  res.toString();
    }

 

发文不易,恳请大佬们高抬贵手!


点赞:随手点赞是种美德,是大佬们对于本人创作的认可!


评论:往来无白丁,是你我交流的的开始!


收藏:愿君多采撷,是大佬们对在下的赞赏!

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kook小辉的进阶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值