学习花式反转——字符串

  • 序:有的时候调用库中直接给的类方法解决起来更轻松,有的时候里面的方法并不能解决实际性问题,这时候就需要我们自个儿重写了。首先我们可以学习库里面方法怎么实现的,随后我们可以写出不同于它的(别人的东西不一定有自个儿的好)下面说说c++STL中string和Java中的String与StringBuffer解决反转问题所遇到的情况。

咱现在就从题入手,进行解释

LeetCode 344.反转字符串

学习花式反转——字符串_第1张图片

(玩呢?我直接调个c++reverse库函数不就解决了吗?(reverse(s.begin(),s.end()) 就这?)

先不急,咱先掌握其实现原理,后续肯定是有用的。

如何反转呢?我们是不是可以利用双指针对左右进行交换,让双指针向中间靠拢。

实现代码:

class Solution {
public:
    void reverseString(vector& s) {
        int left = 0;
        int right = s.size() - 1;
        while(left

交换数据有三种常见的方法:

1. 创建第三变量

int temp = s[left];

s[left] = s[right];

s[right] = temp;

2. 用加法运算(但可能导致数据溢出)

s[left] = s[left] + s[right];

s[right] = s[left] - s[right];

s[left] = s[left] - s[right];

3. 采用位运算(异或^)

s[left] ^= s[right];

s[right] ^= s[left];

s[left] ^= s[right];

(第一种是最好的,不受类型限制,用异或不能解决float等数据类型的数据,数据不大的情况下,第一种更好)

现在掌握了反转字符串的原理,思考一下如果是只反转字符串片段呢?c++中reverse是可以解决这一反转的,但是Java中StringBuffer是不能选取字符串片段进行反转的,接下来看题:

LeetCode 541.反转字符串 ||

学习花式反转——字符串_第2张图片

 这题用c++库还是蛮简单的,首先我们定一下反转的起始位置,每反转一次起始位置就开始变化(左右俩次反转的距离是2*k),然后再确定反转的末位置,如果反转字符小于k了,那就反转起始位置到字符串尽头(s.size()),如果大于k的话,那末位置就是起始位置+k。

C++代码如下:

class Solution {
public:
    string reverseStr(string s, int k) {
        int start = 0;
        int end;
        while(start

如果我们想用Java提供的库方法呢?咱就得采用拼接的形式:

Java采用库的代码如下:

class Solution {
    public String reverseStr(String s, int k) {
        String xs = new String(); //用来存取反转的字符串(也可以说是对字符串s进行重新拼接)
        int start = 0; //一样的,定义起始位置
        while(start

学习花式反转——字符串_第3张图片

这样写真是费时费力不讨喜。 

那Java库中没有提供片段式反转,那么我们可以怎样?自己写一个方法实现呗,题1说了反转实现的原理,外加俩参数定义需要反转的区间就可以了。

接下来看代码,更好理解:

class Solution {
    //反转
    private void reverseS(char[] s,int left,int right){
        while(left

接下来咱拿它去练手:

LeetCode 151.反转字符串中的单词

学习花式反转——字符串_第4张图片

 这题第一步肯定先得去除额外的空格,因为最后结果字符串单词之间最多只能有一个空格。

有俩种想法可以尝试了:

第一种:先将各个单词存入容器中,把单词看成容器里面的元素,然后进行反转就了(这个c++写起来比较轻松)

第二种:先总的反转,然后再将每个单词进行反转,这样也可以得到同样的结果

(这里为了联系上文,只写第二种,第一种有疑问可以发私信,一起交流学习)

代码如下:

class Solution {
    //去除字符串s中多余出来的空格
    private StringBuffer removeExtraSpace(String s){
        s = s.trim(); //去除s的首尾空格
        StringBuffer ss = new StringBuffer(s);
        //去除ss|s中间多余的空格
        for(int i=ss.length()-1;i>=1;--i){
            if(s.charAt(i)==' '&&s.charAt(i-1)==' ')
            ss.delete(i,i+1);
        }
        return ss;
    }
    //反转字符串序列方法
    private void reverseS(StringBuffer ss,int left,int right){
        while(left

再推荐一题练手,和上述方法一样的(当然方法不唯一):

剑指 Offer 58 - ||.左旋转字符串

看完这个有没有想看库里面源码的冲动 ​​​​​

 

点个小赞赞鼓励一下让我知晓你来过‍

我的主页

 

 

 

 

你可能感兴趣的:(算法,Java,leetcode,java,c++)