题目:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
A1:正常思路:从头到尾草庙字符串,每次碰到空格字符则把后面的字符后移2字节,再插入“%20”。时间复杂度O(n2) ===>有重复的字符被移动
A2:把从前向后替换改成从后向前替换:统计字符串中的空格数,则插入后的字符串长度为“原字符串长度 + 空格数 * 2”。得到新字符串的末尾和原字符串的末尾,逐个赋值,遇到空格则逐步插入0,2,%。 时间复杂度O(n)
class Solution { public: void replaceSpace(char *str,int length) {
//排除误操作 if((str != nullptr) && (length > 0)) { int str_length = 0; //字符串实际长度 int num_blank = 0; //空格数 int i = 0; while(str[i] != '\0') { //统计字符串的实际长度 str_length++; if(str[i] == ' ') { num_blank++; } i++; } int new_length = str_length + num_blank * 2; //新字符串长度
//新字符串长度不能大于数组长度,否则出错 if(new_length <= length) { while((str_length >= 0) && (new_length > str_length)) { if(str[str_length] == ' ') { str[new_length--] = '0'; str[new_length--] = '2'; str[new_length--] = '%'; } else { str[new_length--] = str[str_length]; } str_length--; } } } } };
相关题目:
把数组B的所有数字插入数组A中,且所有数字都是排序的(从尾到投比较AB的数字,并把较大的数字复制到A中合适的位置)
删除公共字符:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.”
缩写:把一些长的名字或者短语进行缩写。例如"looks good to me"缩写为"lgtm",短语中的每个单词的首字母组成缩写。现在给出一个字符串s,字符串s中包括一个或者多个单词,单词之间以空格分割,请输出这个字符串的缩写。
字符串变形:对于一个给定的字符串,我们需要在线性(也就是O(n))的时间里对它做一些变形。首先这个字符串中包含着一些空格,就像"Hello World"一样,然后我们要做的是把着个字符串中由空格隔开的单词反序,同时反转每个字符的大小写。比如"Hello World"变形后就变成了"wORLD hELLO"。