[NewCode 4] 替换空格

题目描述

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

最直接的方式,直接使用 STL。假设字符串的长度是n,那么对于每个空格字符,需要移动后面 o(n) 个字符,因此对含有 o(n) 个空格字符的字符串而言时间复杂度为 o(n2),过高了。代码如下:

class Solution {
public:
    string replaceSpace(string str) {
        size_t ix = 0;
        while (ix < str.size()) {
            if (str[ix] == ‘ ‘) {
                str.replace(ix, 1, "%20");
                ix += 3;
            } else {
                ix++;
            }
        }
        return str;
    }
};

比较好的方式,是从后往前移动,如此的时间复杂度是 o(n) 。来看代码:

class Solution {
public:
	string replaceSpace(string str) {
        if (str.empty()) {
            return str;
        }

        int preSize = str.size();
        // 统计空格数量
        int spaceCnt = 0;
        for (const auto &character : str) {
            if (character == ‘ ‘) {
                spaceCnt++;
            }
        }

        // 为str重新分配空间
        int curSize = preSize + (3 - 1) * spaceCnt;
        str.resize(curSize);

        // 替换
        int prePos = preSize - 1;
        int curPos = curSize - 1;
        while (prePos >= 0) {
            if (str[prePos] == ‘ ‘) {
                str[curPos--] = ‘0‘;
                str[curPos--] = ‘2‘;
                str[curPos--] = ‘%‘;
            } else {
                str[curPos--] = str[prePos];
            }

            prePos--;
        }

        return str;

	}
};
时间: 2024-12-30 00:08:17

[NewCode 4] 替换空格的相关文章

【剑指offer】第四题 替换空格

/** * 剑指offer 第4题 替换空格 * 特点:1.先扫描串中的空格数,计算好替换后的长度 * 2.使用双指针,从后面开始向前替换,避免从前开始每次替换后就要移动后面的所有的数据 * 测试用例:特殊:有多个空格 * 错误:数组长度不够,字符串为空 * */ package javaTrain; public class Offer4 { public static void main(String[] args) { String a = "Hello I am Daisy Dong!&

替换空格 4

先遍历每个字符统计空格数 :String.charAt() ? ? 根据空格数计算新的长度 :newLength=oriLength+2*NumOfBlank ? ? 新建一个newLength长度的字符数组tempChars用于存放替换空格之后的字符数组 ? ? 利用System.arraycopy函数将原字符串转换为数组拷贝到新的字符数组tempChars中 ? ? 从新字符数组末尾开始遍历,用一个index1指向新字符数组末尾,用一个index2指向原字符数组末尾所在新字符数组的位置,将原

Pro4 替换空格(java)

注:利用java中stringBuilder,append,length方法很方便的解决字符串问题 1 /* 2 * 剑指offer 替换空格 3 * xsf 4 * */ 5 6 /*开始替换空格的函数,length为原数组的长度,java中length不计算/0*/ 7 class BlankFun{ 8 public String replaceBank(String str) { 9 if(str==null)//输入安全判断 10 return null; 11 //构建一个新的Str

Pro4 替换空格

本题最大的困难是如何在不新建新的数组下完成空格替换,主要考察数组指针的运用 思路:(1)找出字符串空格的长度,从而确定新的子串尾指针的位置所在: (2)通过遍历找出空格,string[indexOfNew--]依次附上%20三个字符,indexOfOriginal-- 注:并没有通过实际指针而是通过字符串下标操作,起始时均指向末尾位置 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 /

java实现——004替换空格

1.创建新的字符串 1 public class T004 { 2 public static void main(String[] args){ 3 System.out.println(replaceBlank("we are happy")); 4 } 5 public static String replaceBlank(String s){ 6 String r = "%20"; 7 String result = ""; 8 for(

【C语言】字符串替换空格:实现一个函数,把字符串里的空格替换成“%20”

//字符串替换空格:实现一个函数,把字符串里的空格替换成"%20" #include <stdio.h> #include <assert.h> void replace(char *src) { assert(src); int OldLen = 0; //原字符串长度 int NewLen = 0; //新字符串长度 int BlackNum = 0; //空格数量 int NewBack = 0; //新字符串尾部 int OldBack = 0; //原

【c语言】字符串替换空格:请实现一个函数,把字符串中的每个空格替换成“%20”

// 字符串替换空格:请实现一个函数,把字符串中的每个空格替换成"%20". // 例如输入"we are happy.",则输出"we%20are%20happy." #include <stdio.h> #include <assert.h> char* replace(char* p) { char* ret = p; int num = 0; int oldlen = 0; int newlen = 0; char

剑指Offers 题目1510:替换空格

题目1510:替换空格 题解报告:  水题,注意数据,我是用最简单的办法,一扫而替换,判断的时候注意,s[i]!=0,全局数组初始化默认为0,我开始用了strlen(s)判断,超了不少时,哎呀! #include <stdio.h> #include <stdlib.h> #include <string.h> char s[10000001]; int main() { while(gets(s)){ for(int i=0; s[i]!=0; i++){ if(s[

替换空格--《剑指offer》

如题所示,题目很简单,替换空格,将字符串中的空格替换为%20: 即"we are happy"替换成"we%20are%20happy": 如果每当我们遇到一个空格就将字符串向后平移两位,这样复杂度就是O(n2)了,这样的方法是不可取的,按照作者的来说,offer已不足拿到了: 而当我们反向从字符串末尾开始遍历,复杂度仅为O(n),当然前提的是该字符串有足够空间,否则替换会失败. 了解到思想之后程序也就比较简单了,发现自己的与作者的写的也比较类似,就此贴上了...