C++ 数组 指针

题目描述

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

实现结果

运行时间:3ms

占用内存:476k

知识点

  • 数组+指针
    • 数组
    • 指针
    • 1
    • 2

1)char还有一个特殊的语言就是char *,它在C/C++中有专门的语义,既不同于signed char *,也不同于unsigned char *,专门用于指以’\0’为结束的字符串。

参考说的很全:深入 理解char * ,char ** ,char a[ ] ,char *a[] 的区别

//一脚给DIV线踹了 一上午的工作为零 呵呵呵呵呵呵呵呵呵呵呵呵。。。。。但是路一直走一直走就会远的!
//指针和数组是密切相关的。事实上,指针和数组在很多情况下是可以互换的。例如,一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组。
const char* c1 = "hello word";//指针,变量只占4字节 32位
char[] c2 = {"hello word"}//数组,sizeof(c2)? \0数组结尾
//修改:
*(c1+2) = 'a';//指针指向(c1+2)是可以改变的
c2[2]  = 'a';//c2数组内存中的区域可改的
//赋值:
c1 = c2;//可以(c1指针名为变量类型)
c2 = c1;//不可以(c2数组名为指向数组开头的常量)
//不想写了!这一脚出来了很多问题。。。。。

2)char char* string char[] 转化。

class Solution {
public:
	void replaceSpace(char *str,int length) {//length数组长度不是字符串长度
        if(str==NULL)//字符串为空
             return ;
         int CountOfBlanks=0;
         int Originallength=0;
         for(int i=0;str[i]!='\0';i++)
         {
             Originallength++;
             if(str[i]==' ')
             {
                 ++CountOfBlanks;
             }
         } 
         int len =Originallength+2*CountOfBlanks;
         //char *--->string**********************************
          string temp = str;
         //string---->char[]**********************************
         char p[len];
        int i;
        for(i = 0;i<len;i++)
        {
            p[i] = temp[i];
        }
         p[i] = '\0';
        //char[]--->string**********************************
         temp = p[len];
        //string -->char***********************************
        //const char* pp = temp.data();//加const  或者用char * p=(char*)str.data();的形式
         str = (char *)temp.data();
	}
};

2)栈

这里会有的

代码展示

class Solution {
public:
    void replaceSpace(char *str,int length) {//length 是数组长度
       if(str==NULL||length<0)
            return ;
        int i=0;
        int sorcelength=0;//记录以前的长度
        int black=0;//记录空格的数量
        for(;str[i] != '\0';i++)
        {
            sorcelength++;
            if(str[i] == ' ')
            {
                black++;
            }
        }
        int newlength=sorcelength+black*2;//插入后的长度
        if(newlength>length)//如果计算后的长度大于总长度就无法插入
            return ;
        int pOld=sorcelength; //注意不要减一因为隐藏个‘\0’也要算里
        int pNew=newlength;
        //从后向前插入
        for(;pOld>=0 && pNew >pOld;pOld--)
        {
            if(str[pOld] == ' ')
            {
                str[pNew--] = '0';
                str[pNew--] = '2';
                str[pNew--] = '%';
            }
            else
            {
                str[pNew--] = str[pOld];
            }
        }
}
};

小结

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值