力扣 [344、541、剑指offer 05.、151、剑指offer58-ll]

这篇具有很好参考价值的文章主要介绍了力扣 [344、541、剑指offer 05.、151、剑指offer58-ll]。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

344.反转字符串

原题链接

解题思路:

双指针:自己的

  1. 双指针,左指针指向开头,右指针指向末尾。
  2. 交换两个左右指针。
  3. 左右指针向中间移动。

时间复杂度:O(n);
空间复杂度:O(1);

实现代码:

class Solution {
public:
    void reverseString(vector<char>& s) {
        int n = s.size();
        int l = 0, r = n - 1;
        while (l < r) {
            swap(s[l ++], s[r --]);
        }
        return ;
    }
};

541. 反转字符串II

原题链接

解题思路:

分类讨论:自己的

分类讨论:

  1. 如果剩余字符少于k个,则将剩余字符全部反转。
  2. 如果剩余字符大于或等于k个,则反转前k个字符,其余字符保持原样。可以每次处理2k个字符,判断并调用库函数reverse进行反转操作。

时间复杂度:O(n/2) = O(n);
空间复杂度:O(1);
力扣 [344、541、剑指offer 05.、151、剑指offer58-ll],力扣 3000 题,leetcode,算法,职场和发展

实现代码:

class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.size();

        for (int i=0; i < n; i += 2*k) {
            //2k < n 的情况:
            if (2*k <= n - i) {
                reverse (s.begin() + i, s.begin() + i + k);
            }
            // k <= n < 2k
            else if (n-i >= k) {
                reverse(s.begin() + i, s.begin() + i + k);
            }
            // n < k;
            else {
                reverse (s.begin() + i, s.end());
            }
        }

        return s;
    }
};

优化:

class Solution {
public:
    string reverseStr(string s, int k) {
        int n = s.size();

        for (int i=0; i < n; i += 2*k) {
            if (k <= n - i) {
                reverse (s.begin() + i, s.begin() + i + k);
            }
            else {
                reverse (s.begin() + i, s.end());
            }
        }
        return s;
    }
};

剑指Offer 05.替换空格

原题链接

解题思路:

原数组上替换空格:自己的

  1. 扩充字符串的长度,由于一个空格 = “%20”,即相当于三个字符,等价于多了两个字符。
  2. 通过resize()函数,重新设置大小。即统计空格的数量,新字符串的大小 = 原字符串长度的大小 + 空格数量 * 2;
  3. 所以第一步是统计空格的数量。
  4. 第二步扩容。
  5. 第三步:从后往前遍历字符串,将一个指针指向新字符串的末尾。另一个指针指向旧字符串的末尾,然后若当前旧字符串的指针指向的是字母,则将其丢给新的字符串。如果是空格的话,则先处理新字符串的指针,从后往前填充三个字符:“%20”;然后再使得新旧字符串的指针同时向前移动!

实现代码:

class Solution {
public:
    string replaceSpace(string s) {
        int cnt=0;
        int old = s.size();
        for (int i=0; i <  old; i ++) {
            if (s[i] == ' ') {
                cnt ++;
            }
        }

        s.resize(old + cnt * 2);

        int n = s.size();
        for (int l = old-1, r=n-1; l < r; l --, r --) {
            if (s[l] != ' ') {
                s[r] = s[l];
            }
            else {
                s[r--] = '0';
                s[r--] = '2';
                s[r] = '%';
            }
        }
        return s;
    }
};

151.翻转字符串里的单词

原题链接

解题思路:

双指针:别人的

本题要求返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。仅反转字符串中单词的顺序,单词本身并没有反转。也就是说,最后一个单词反转到第一个位置,单词本身没有变。可以先反转整个字符串,然后再反转每个单词,在反转过程中,去掉多余空格。

如何反转单词 :
用start变量扫描字符串,遇到第一个非空格字符时,end=start;读取字符s[end],放入s[i],然后end++,i++,i用来控制反转后的字符串下标,当s[end]为空格时,就找到了一个单词。使用reverse函数反转该单词更新start为end,反转下一个单词。

实现代码:

class Solution {
public:
    string reverseWords(string s) {
        int n = s.size();
        reverse(s.begin(), s.end());
        int i=0;
        for (int start = 0; start < n; start ++) {
            //先找到第一个不为空格的字符,等于跳过行首空格!
            if (s[start] != ' ') {
                //单词之间加个空格:
                if (i != 0) {   //i!=0,是为了排除行首添加空格!
                    s[i ++] = ' ';
                }
                int end = start;
                //不停寻找当前单词的末尾,直到找到空格为止,则当前单词一定是在[start, end);
                while (end < n && s[end] != ' ') {
                    s[i ++] = s[end ++];
                }
                //翻转单词,由于i指向的是末尾,所以通过计算当前单词的长度,然后求得左右端点
                //然后反转区间内的单词。
                reverse (s.begin() + i - (end - start), s.begin() + i);
                // 处理下一个单词
                start = end;
            }
        }
        s.erase (s.begin() + i, s.end());
        return s;
    }
};

剑指Offer58-II.左旋转字符串

原题链接

解题思路:

局部反转 ->整体反转:

题意:将字符串的前n个字符移动到末尾。
而我们的reverse函数翻转的话,会改变单词之间的顺序。
但很重要的一点是:一个字符串,进行两次reverse翻转的话,等价于没有变动!

所以我们可以先将前 n 个字符串进行翻转,然后再将 第 n 个 之后的字符串进行翻转。(两次局部的翻转)

然后再整体翻转:则得到理想的效果!

若先整体翻转的话,的确,我们想要的字符串部分,是移动到了末尾,但是字符串内部的字符顺序是颠倒的,也可以这时候来索引n,划分区间,然后进行两次局部翻转。不过这时候的话:区间为:[… ,倒数第n个],[倒数第n个,之后];

不过倒数的n,不如正数的n;

总之:两次局部翻转 + 一次整体翻转!

实现代码:

class Solution {
public:
    string reverseLeftWords(string s, int n) {
        reverse(s.begin(), s.begin() + n);
        reverse(s.begin() + n, s.end());
        reverse(s.begin(), s.end());
        return s;
    }
};

总结:

双指针还可以用来翻转字符串、索引区间、原数组上更新、文章来源地址https://www.toymoban.com/news/detail-616537.html

到了这里,关于力扣 [344、541、剑指offer 05.、151、剑指offer58-ll]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (字符串 ) 剑指 Offer 58 - II. 左旋转字符串 ——【Leetcode每日一题】

    难度:简单 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串\\\"abcdefg\\\"和数字2,该函数将返回左旋转两位得到的结果\\\"cdefgab\\\"。 示例 1: 输入: s = “abcdefg”, k = 2 输出: “cdefgab” 示例 2:

    2024年02月08日
    浏览(45)
  • LeetCode:剑指Offer 05. 替换空格 (字符串)

    🍎道阻且长,行则将至。🍓 🌻算法,不如说它是一种思考方式🍀 算法专栏: 👉🏻123 上一题:344. 反转字符串 本文速览: 🌻剑指 Offer 05 . 替换空格 - 简单 🌼151. 反转字符串中的单词-中等 题目描述 :请实现一个函数,把字符串 s 中的每个空格替换成\\\"%20\\\"。 来源:力扣(

    2023年04月11日
    浏览(87)
  • (字符串 ) 剑指 Offer 05. 替换空格 ——【Leetcode每日一题】

    难度:简单 请实现一个函数,把字符串 s 中的每个 空格 替换成 “ %20 ”。 示例 1: 输入:s = “We are happy.” 输出:“We%20are%20happy.” 限制 : 0 = s 的长度 = 10000 💡思路:双指针法 如果想把这道题目做到 极致 ,就不要只用额外的辅助空间了! 首先扩充数组到每个空格替换

    2024年02月08日
    浏览(62)
  • leetcode(力扣) 剑指 Offer 12. 矩阵中的路径(回溯 DFS)

    给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

    2024年02月14日
    浏览(46)
  • 剑指 Offer 58 - I. 翻转单词顺序

    剑指 Offer 58 - I. 翻转单词顺序 不用内置方法 去除首尾空格和中间多余空格 翻转所有字符 翻转每个单词 用自带的 trim() 和 substring() ,要自己实现这两个方法也很简单。

    2024年02月11日
    浏览(33)
  • 剑指 Offer 05. 替换空格

    力扣 请实现一个函数,把字符串 s 中的每个空格替换成\\\"%20\\\"。 示例 1: 输入:s = \\\"We are happy.\\\" 输出:\\\"We%20are%20happy.\\\" 限制: 0 = s 的长度 = 10000  题解: 算法流程:     初始化一个字符串,记为 res ;     遍历字符串 s 中的每个字符 s[i]:         当 s[i] 为空格时:向 re

    2024年02月15日
    浏览(54)
  • 剑指Offer题集(力扣)

    难度简单1155 找出数组中重复的数字。 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。 示例 1: 限制: 方法一:哈希 方法二:原地交

    2024年02月03日
    浏览(36)
  • LeetCode 周赛 344(2023/05/07)手写递归函数的固定套路

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问。 大家好,我是小彭。 今天下午有力扣杯战队赛,不知道官方是不是故意调低早上周赛难度给选手们练练手。 往期周赛回顾:LeetCode 单周赛第 343 场 · 结合「下一个排列」的贪心构造问题 T1. 找出不同

    2024年02月03日
    浏览(35)
  • 【LeetCode】剑指 Offer(25)

    目录 题目:剑指 Offer 49. 丑数 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 丑数这道题用到一点动态规划的思想, 具体思路如下: 根据题意: 如果说第一个丑数是一,包含质因子 2、3 和 5 的数称作丑数, 那么我们发现,之后的丑数: 都是前

    2023年04月09日
    浏览(50)
  • 【LeetCode】剑指 Offer(21)

    目录 题目:剑指 Offer 39. 数组中出现次数超过一半的数字 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 题目:剑指 Offer 40. 最小的k个数 - 力扣(Leetcode) 题目的接口: 解题思路: 代码: 过啦!!! 写在最后: 这道题,我的思路是直接排序, 然后返回中间

    2023年04月10日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包