【九章斩题录】C/C++:替换空格(JZ5)

这篇具有很好参考价值的文章主要介绍了【九章斩题录】C/C++:替换空格(JZ5)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

    【九章斩题录】C/C++:替换空格(JZ5) 精品题解 🔥 《九章斩题录》  👈 猛戳订阅

【九章斩题录】C/C++:替换空格(JZ5)

📜 目录:

JZ5 - 替换空格

「 法一 」暴力美学

「 法二 」另开数组

「 法三 」反向替换(利用 rfind + replace)

「 整活 」不用C++,Python 一行代码搞定


JZ5 - 替换空格

📚 题目:请实现一个函数,将一个字符串  中的每个空格替换成 " %20 " 。例如当字符串为 We Are Happy.  则经过替换之后的字符串为 We%20Are%20Happy 。

💭 示例:I/O

输入:"We Are Happy"
返回:"We%20Are%20Happy"

输入:" "
返回:"%20"

✅ 模板:C语言

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param s string字符串 
 * @return string字符串
 */
char* replaceSpace(char* s ) {
    // write code here
}

✅ 模板:C++

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    string replaceSpace(string s) {
        // write code here
    }
};

「 法一 」暴力美学

💡 思路:两次循环遍历整个数组,第一次循环寻找空格的位置,第二次循环将空格后的字符整体后移 2 个单位 (腾出空间给 %20),然后再将 %20 插入即可。因为 ''%20'' 为 3 个字符,分别是 (%, 2, 0),因为空格处用来放置 '%',所以只需腾出 2 个空间给 '2' 和 '0' 即可。

【九章斩题录】C/C++:替换空格(JZ5)

 循环次数为两次,因此时间复杂度为 ,空间复杂度为 。

💬 代码演示:C++

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param s string字符串 
     * @return string字符串
     */
    string replaceSpace(string s) {
        // 统计空格数
        int i = 0;
        int count = 0;
        for (i = 0; i < s.size(); i++) {
            if (s[i] == ' ') {
                count++;
            }
        }
        // 重新开大小,大小为 旧字符串大小 + 空格数 x 2
        // 这样就有足够的位置放 %20了
        // 原字符串空格放%,新开的放 2 和 0
        s.resize(s.size() + count * 2);

        i = 0;
        int j = 0;
        while (i < s.size()) {
            if (s[i] == ' ') {
                // 整体后移两个单位
                for (j = s.size() - 1; j > i + 2; j--) {
                    s[j] = s[j - 2];
                }
                s[i] = '%';
                s[i + 1] = '2';
                s[i + 2] = '0';
            }
            else {
                i++;
            }
        }

        return s;   // 返回原字符串
    }
};

「 法二 」另开数组

💡 思路:我们直接重新开一个字符数组,依次读取原整个字符串的内容,读到空格就在后面加上 '‘%20'' 然后继续读。其主要思路如下:

① 创建一个新的字符型数组,用于存放替换空格后的字符串。
② 从头到尾遍历字符串 ,遍历到 \0 为止。
③ 对每个字符都进行判断,判断当前字符是否为空格,如果为空格就分别向后插入 %, 2, 0。
④ 如果当前字符不是空格,就将当前字符串的字符直接加到新数组中。
⑤ 最后记得在新数组末尾手动加上 \0,最后返回新数组即可,此时就实现了空格的替换。

这种方法需要创建新的空间,不修改源字符串,这种方法非常易于理解和实现,属于 "重新来过" 的思想。其时间复杂度为 ,空间复杂度为 。

💬 代码演示:C

char* replaceSpace(char* s ) {
    char arr[10000] = {0};
    int i = 0;

    while (*s != '\0') {
        if (*s == ' ') {
            arr[i++] = '%';
            arr[i++] = '2';
            arr[i++] = '0';
        }
        else {
            arr[i++] += *s; 
        }
        s++;
    }
    arr[i] = '\0';

    return arr;
}

「 法三 」反向搜空格然后替换(利用 rfind + replace)

💡 思路:有现成的 replace 接口可以拿来替换,又有现成的 find 接口可以拿来查找空格。直接调接口来解决问题,岂不美哉?这里我们用 rfind 反向查找,从字符串  的末尾向前查找空格,如果找到就调用 replace 把空格替换成 '%20' 即可。

💬 代码:C++

class Solution {
public:
    string replaceSpace(string s) {
        int end = s.size() - 1;    // 字符串s的最后一个元素的下标

        while (string::npos != s.rfind(' ', end)) {
            int space = s.rfind(' ', end);    // 倒着找空格,避免覆盖
            s.replace(space, 1, "%20");       // 将字符串s中空格开始的1个字符替换为%20
            end = space;                      // 下次从空格前一个位置开始查找
        }

        return s;
    }
};

先定义 end 用于记录最后一个字符的位置,然后倒着遍历字符串。这里的循环条件是判断 rfind 是否为 npos,因为当 findrfind 在字符串中找不到指定字符或子字符串时,它们会返回 string::npos。如果是 npos 那就说明没找到空格,说明查找完毕了,就结束循环。如果有空格,我们就记录空格的位置,然后调用 replace,把空格替换成 %20,然后更新我们的 end。每次循环都会判断是否存在空格,如果从右向左找一遍没有空格也就没有必要在进入循环,说明没有需要替换的,或者已经替换完了,这时直接 return s 即可。

⚡ 代码简化:

class Solution {
public:
    string replaceSpace(string s) {
        int space, end = s.size() - 1;
        for (; (space = s.rfind(' ', end)) != string::npos; end = space)
            s.replace(space, 1, "%20");
        return s;
    }
};

「 整活 」不用C++了,Python 一行代码搞定

"人生苦短,我用 Python…… "

不用做了,用隔壁蟒蛇直接一行结束了。

return s.replace(' ', "%20")

【九章斩题录】C/C++:替换空格(JZ5)

📌 [ 笔者 ]   王亦优
📃 [ 更新 ]   2023.5.30
❌ [ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考资料 

C++reference[EB/OL]. []. http://www.cplusplus.com/reference/.

Microsoft. MSDN(Microsoft Developer Network)[EB/OL]. []. .

百度百科[EB/OL]. []. https://baike.baidu.com/.

牛客网. 剑指offer 题解 [EB/OL]. []. https://www.nowcoder.com/exam/oj/ta?tpId=1kon文章来源地址https://www.toymoban.com/news/detail-476748.html

到了这里,关于【九章斩题录】C/C++:替换空格(JZ5)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【剑指offer】替换空格

    👑专栏内容:力扣刷题 ⛪个人主页:子夜的星的主页 💕座右铭:前路未远,步履不停 剑指offer:替换空格 请实现一个函数,将一个字符串s中的每个空格替换成“%20”。 例如,当字符串为We Are Happy则经过替换之后的字符串为We%20Are%20Happy。 数据范围: 0 ≤ l e n ( s ) ≤ 1000

    2024年01月17日
    浏览(54)
  • 剑指offer面试题4 替换空格

    分析: 关于字符串的考点无非就是字符串的遍历以及关于字符串类型本身提供的方法,后者其实主要考察你对语言本身是否足够熟悉,比如java语言中String类型支持哪些方法,这个太具体了,不太符合对抽象的数据结构和算法的考察标准。因此思路还是要往提升时间或者空间

    2024年01月16日
    浏览(43)
  • 剑指Offer--05替换空格&&58左旋字符串

    题目是这样的 意思是将字符串s中的空格替换为字符串\\\"%20\\\",如果只是替换一个字符还好,可以在原数组直接替换,但是是将空格替换为字符串,所以再在原数组上替换,原数组原内容会被覆盖,且长度大小不够,所以此时要动态开辟一个字符数组,这个数组开多大?考虑最坏

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

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

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

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

    2024年02月08日
    浏览(72)
  • 【LeetCode】替换空格&&消失的数字&&分割链表&&除自身以外数组的乘积

    ​🌠 作者:@阿亮joy. 🎆 专栏: 《阿亮爱刷题》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 请实现一个函数,把字符串 s 中的每个空格替换成\\\"%20\\\"。 示例 1: 输入: s = \\\"We are happy.\\\" 输出: \\\"We%20are%2

    2024年02月22日
    浏览(37)
  • 替换空格&&反转字符串中的单词(LeetCode 剑指offer05 && 151)

    题目 剑指 Offer 05. 替换空格  思路 遍历,使用新的字符串来接原字符串,如为空格,则加入%20,否则加入原字符串。  不过看了题解有另一种解法,由于空格转化为%20,设计到原字符存储空间的增加,因此先计算出需要增加的空间后。再使用双指针,从后往前遍历,这里画的

    2024年02月16日
    浏览(46)
  • 爬虫009_字符串高级_替换_去空格_分割_取长度_统计字符_间隔插入---python工作笔记028

    然后再来看字符串的高级操作 取长度  查找字符串下标位置  判断是否以某个字符,开头结尾   计算字符出现次数   替换

    2024年02月14日
    浏览(48)
  • 【shell 基础(11)循环之for】带列表:空格子串、换行子串、展开、命令替换、seq;不带列表:接受参数、类C

    注意:list可以是含有 空格 或者是 换行 的字串。 换行:则可以读取遍历一个文件;或者命令输出时,带有换行 空格:则可以构成一个数组,或者就是字串   2.1. 循环字串   2.2. 展开或命令替换:数字循环 连续数字相加   从1开始步长为2计算和,即计算1到100的奇数和   2.

    2023年04月08日
    浏览(40)
  • 【算法第六天7.19】反转字符串,反转字符串||,剑指 Offer 05. 替换空格,反转字符串的单词, 左旋转字符串

    ================================================ 思路 :以中间为分界线,左右两个边界交换字符,依次向里收缩 思路 : 首先:字符串转化为字符数组 char[] res = s.toCharArray(); 最后:将数组再转回字符串 return new String(res); 1、循环以2k为单位, 2、在这个2k长的数组中进行反转,需要有首

    2024年02月16日
    浏览(65)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包