剑指 Offer 05. 替换空格

请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
示例 1:

输入:s = "We are happy."
输出:"We%20are%20happy."

1.思路:统计扩容大小,由后向前
2.扩容大小 空格数*2
3.判断等于空格 s[i] = =’ ’
4.新旧字符串的范围 0-s.size()-1
5.字符串填充复制加’ ‘
6.s.size() 的长度获取字符串长度,不包含终止符,
7.strlen 函数(和size()函数作用同)和 sizeof运算符区别

strlen是函数运行时出结果,计算字符串长度,遇到 \0结 束,不包含 \0
sizeof是运算操作符编译时出结果,计算内存空间大小,包括字符串自带的 \0

练习:

char *str1 = "asdfgh";
char str2[] = "asdfgh";
char str3[8] = {'a', 's', 'd'};
char str4[] = "as\0df";
sizeof(str1) = 4;  strlen(str1) = 6;//str是字符指针变量,32位操作系统大小为4
sizeof(str2) = 7;  strlen(str2) = 6;
sizeof(str3) = 8;  strlen(str3) = 3;
sizeof(str4) = 6;  strlen(str4) = 2;

char c[] = "asdsds";
char* cc = c;
char cn[40] = "asdsds";
int a[] = {1,2,3,4,5,6};
int* aa = a;
cout << sizeof(c) << sizeof(cc) << sizeof(*cc) << sizeof(cn);
cout << sizeof(a) << sizeof(aa) << sizeof(*aa);
sizeof(c) = 7          //c是数组,计算到'\0'位置,结果为6*1+1=7
sizeof(cc) = 8         //cc为指针类型,大小为8
sizeof(*cc) = 1        //*cc指向c的第一个字符,大小为1
sizeof(cn) = 40        //开辟40个char空间,大小为40*1=40
sizeof(a) = 24         //a是数组,但不需计算到'\0',结果为6*4=24
sizeof(aa) = 8         //aa为指针类型,大小为8
sizeof(*aa) = 4        //*aa指向a的第一个数字,大小为4

8.为什么这里的cn和a不代表首地址?

char cn[40] = “asdsds”; //sizeof(cn) =40
int a[] = {1,2,3,4,5,6};
int* aa = a; //sizeof(a) = 24; sizeof(*aa) =4;

{
int a[5]={1,2,3,4,5};
printf("sizeof数组名=%d\n",sizeof(a));    
printf("sizeof *数组名=%d\n",sizeof(*a));
}
运行结果

sizeof数组名=20
sizeof *数组名=4

数组名代表首地址,sizeof(数组名)为整个数组所占内存空间大小
*数组名代表首地址所指内容,即首元素

程序如下:

 string replaceSpace(string s) {
        int count = 0;
        //统计扩容大小,由后向前
        for(int i = 0; i < s.size(); i++){
            if(s[i] == ' ')count++; //空格怎么表示
        }
        int lenths = s.size();
        int newlenth = 0;
        s.resize(lenths+count*2);

        for(int j = s.size()-1,lenth =lenths-1; j >= 0;lenth--){ //j的取值 0-s.size()
            if(s[lenth] == ' ') {
                s[j--]='0';
                s[j--]='2';
                s[j--]='%'; 
           
            }
            else{
                s[j] = s[lenth];
                j--;
            }           
        }
        return s;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值