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

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

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

如果你也喜欢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();
    }

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


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


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


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

猜你喜欢

转载自blog.csdn.net/m0_55278347/article/details/129231572