刷题日记Day1 剑指offer 58 -1

230 阅读1分钟

这是算法学习的第一天,今天学习的是 leetcode 剑指offer 58 -1,坚持就是胜利。

Snipaste_2022-09-09_09-33-23.png

C++

题解

看到题目的第一眼,双指针 的方法就出现在我的脑海,但是由于前后的空格,实现的过程并不顺利。

class Solution {
    public: string reverseWords(string s) { 
        int n = s.size(); 
        int i = n-1,j=n-1; 
        string res;
        int k = 0;
        while(s[k] == ' ') k++;
        while(i>=k){ 
            while(i>=k&&s[i] == ' ') { i--;j--; }
            while(i>=k&&s[i] != ' ') i--; 
            res+=s.substr(i+1,j-i); 
            if(i>=k) res+=' '; j=i; 
        } 
        return res; 
    } 
};

实现的思路也是非常的简单:(这里以示例2为例)

QQ图片20220909094549.jpg

然后看到了官方的解法。

class Solution { 
    public: string reverseWords(string s) {
        reverse(s.begin(),s.end());
        int idx = 0,i; int n = s.size(); 
        for(i=0;i<n;i++){ 
            if(s[i] != ' '){ 
                if(idx != 0) s[idx++] = ' ';
                int j = i; 
                while(s[j] != ' ' && j<n) s[idx++] = s[j++];
                reverse(s.begin()+idx-(j-i),s.begin()+idx);
                i = j; 
            }
        } 
        s.erase(s.begin()+idx,s.end());
        return s; 
    }
};

官方是在原本的字符串上直接进行操作,引用了一个变量 idx 进行标记。

QQ图片20220909101149.jpg

reverse函数

Snipaste_2022-09-09_10-15-51.png

值得注意的是,这里的 begin 指的是第一个元素,但是 end 是最后一个元素的下一个元素。

substr函数

Snipaste_2022-09-09_10-20-00.png

erase函数

e850352ac65c1038d070292abe119313b17e89c8.webp

JavaScript

题解

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    return s.trim().split(/\s+/).reverse().join(' ');
};

这里纯粹就是 JavaScript 的API了

trim函数

Snipaste_2022-09-09_10-36-58.png

split函数

JavaScript split() 方法 | 菜鸟教程 (runoob.com)

Snipaste_2022-09-09_10-42-18.png

结语

算法小白的算法笔记。

文章如果有不正确的地方,欢迎指正,共同学习,共同进步。

若有侵权,请联系作者删除。