从化做网站开发,app找什么公司,wordpress无限加载插件,苏州做公司邮箱企业网站题目描述#xff1a; 请实现一个函数#xff0c;将一个字符串中的每个空格替换成“%20”。例如#xff0c;当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 解题思路有#xff1a; #判断字符串是否为空#xff0c;判断length是否大于0。 #记录空格的数…题目描述 请实现一个函数将一个字符串中的每个空格替换成“%20”。例如当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。 解题思路有 #判断字符串是否为空判断length是否大于0。 #记录空格的数量没有空格直接返回原字符串。 1考虑的问题替换字符串是在原字符串上修改A还是新建字符串修改B 2在当前字符串替换怎么替换才更有效率 2-1 从前往后替换后面的字符要不断往后移动要多次移动所以效率低下在原字符串改动时 2-2 从后往前先计算需要多少空间然后从后往前移动则每个字符只为移动一次这样效率更高一点。 测试用例 1输入中包含空格空格位于最前方最后方中间有连续多个空格 hello world 2输入中没有空格 3特殊输入测试字符串是nullptr指针字符串是空字符串 代码 A 新建字符串从前往后复制 运行时间3ms 占用内存400-600k 1 class Solution {2 public:3 void replaceSpace(char *str,int length) {4 //判断特殊的情况5 if(strNULL||length0)6 return;7 int totalLength0;8 vectorint index ;9
10 for (int i0;str[i]!\0;i){
11 totalLength;
12 //if(isspace(str[i]))
13 if(str[i] )
14 index.push_back(i);
15 }
16
17 if (index.empty()) //判断是否有空格
18 return;
19 else{
20 int spaceNum index.size();
21 char* newstr new char [totalLengthspaceNum*21]; //用不用加1
22
23 for(int i0,k0;itotalLength;i) // 判断的时候有等于\0也要拷贝
24 {
25 if(iindex[k]){
26 *newstr%;
27 *newstr2;
28 *newstr0;
29 str;
30 k;
31 }
32 else
33 *newstr*str;
34 }
35 newstrnewstr-(totalLengthspaceNum*2)-1;
36 strstr-totalLength-1;
37 for(int j0;j(totalLengthspaceNum*2);j){
38 str[j]newstr[j];
39 }
40 }
41 }
42 }; new array front to back 注意 1」主体代码line23-34执行结束后newstr指针内存储修改后的代码。但该段代码执行后指针指向\0的后一位因此要多减一个1要根据字符串长度将指针移回原始位置。不要忘记指针移动 2」要修改的是str因此将newstr的值拷贝给str函数运行结束后newstr的被释放局部作用域。 3」if (strNULL||length0)使用||而不是。 B 原始字符串从后往前复制(使用数组) 运行时间5ms 占用内存476k 1 class Solution {2 public:3 void replaceSpace(char *str,int length) {4 if (strNULL||length0) //应该使用||而不是因为两个中任意一个成立均不用在判断5 return;6 int totalLen 0,spaceNum0;7 for(int i0;str[i]!\0;i){8 totalLen;9 if(str[i] )
10 spaceNum;
11 }
12 int totalNew totalLen 2*spaceNum;
13 //注意c中u取反使用而不是1-2结果是true
14 if(!spaceNum||totalNewlength) //totalNewlength应该是大于符号
15 return;
16 for(int k totalLen,jtotalNew;k0;k--,j--){
17 if(kj)
18 return;
19 if(str[k] ){
20 str[j]0;
21 str[--j]2;
22 str[--j]%;
23 }
24 else{
25 str[j]str[k];
26 }
27 }
28 }
29 }; ori array back to front 注意 1」C中取反使用即int spaceNum 1; !spaceNum; 结果是0 而spaceNum 结果是-2true 2」20-21规律如下 20的原码0001 0100 操作1110 1011逐位取反这是一个负数负数在计算机中以补码形式存储。因此该序列是一个负数的补码。 该负数的补码1110 1011 该负数的反码1110 1010 减1 该负数的原码1001 0101首位是符号位-10010101为21。最后结果为-21。 C 原始字符串从后往前复制使用指针 1 class Solution {2 public:3 void replaceSpace(char *str,int length) {4 if(strNULL||length0)5 return ;6 int CountOfBlanks0;7 int Originallength0;8 for(int i0;str[i]!\0;i)9 {
10 Originallength;
11 if(str[i] )
12 CountOfBlanks;
13 }
14 int len Originallength2*CountOfBlanks;
15 if(len1length||!CountOfBlanks) //即lenlength
16 return ;
17
18 char*pStr1strOriginallength;//复制结束符‘\0’
19 char*pStr2strlen;
20 while(pStr1pStr2)
21 {
22 if(*pStr1 )
23 {
24 *pStr2--0;
25 *pStr2--2;
26 *pStr2--%;
27 }
28 else
29 {
30 *pStr2--*pStr1;
31 }
32 --pStr1;
33 }
34 }
35 }; use point 1」当两个指针相等的时候终止。此时已经没有空格了 编写代码时遇到的问题 1判断字符串char *str是否为空if(strNULL) 2判断某个字符是否是空格两种方法isspace(str[i]) 或 if(str[i] ) 基础知识 1字符串的最后一个字符是\0用于判断一个字符串是否结束。 2编写程序时一定要考虑极端的情况如要查找的数组是空的字符串是空的要赋值的对象是同一个对象等。 3原码一个正数转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码 反码正数的反码就是原码负数的反码等于原码除符号位以外所有的位取反 补码正数的补码与原码相同负数的补码为 其原码除符号位外所有位取反得到反码了然后最低位加1 即正数的反码和补码都与原码相同。 在计算机中正数是直接用原码表示的负数用补码表示 仍存在的问题 1length是指什么 猜测限定原始字符串指针str可扩展的内存空间即记录总长度。 # prac 02 class Solution {
public:void replaceSpace(char *str,int length) {cout strendl;int num_sapce 0;for(int i 0;ilength;i)if (str[i] )num_sapce1;//if (num_sapce1)//return str;int new_length length 2*num_sapce;char* new_str new char[new_length];for(int old_index length-1,new_index new_length -1; old_index0;)if (str[old_index] ){old_index-1;new_str[new_index--]0;new_str[new_index--]2;new_str[new_index--]%;}else {new_str[new_index]str[old_index];old_index-1;new_index-1;}for (int k 0;knew_length;k){str[k]new_str[k];}}
};
//题目要求在原来的字符串上修改即字符串首地址不变
//因此要把字符串在一次赋值回去可以选择不生成新的变量在原地址上修改。转载于:https://www.cnblogs.com/GuoXinxin/p/9955330.html