剑指offer-替换空格

题目描述

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

code

class Solution {
public:
	void replaceSpace(char *str,int length) {
	    //先计算修改后的字符串长度
	    int space=0;
	    char* p1=str;
	    while(*p1!='\0'){
            if(*p1++==' ')//计算顺序:先指针后+1
            space++;
	    }
	    char *p2=p1+2*space;//当前p1指针在原字符串末尾,p2指针在增加空格后的字符串末尾
	    while(p1!=p2){//当怕p1==p2时,说明所有空格填充完毕
            if(*p1!=' '){
                *p2-- = *p1--;
            }
            else {
                *p2-- = '0';
                *p2-- = '2';
                *p2-- = '%';
                p1--;
            }
	    }
	}
};
  • 利用两个指针p1和p2修改str指针
  • 画图做步骤感受一下
  • 笔记:
void f(char p)
char c ; 
f(c);//传值

void f(char *p)
char *c ;
f(c);//传值

void f(char *p)
char c ; 
f(&c);//传地址

void f(char **p)
char *c ; 
f(&c) ;//转地址

测试用例

输入:hello words
输出:hello%20world

两段传值(?)代码
稍后研究下

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/*
class Solution {
public:
	void replaceSpace(char *str,int length) {
        char ch[length*3+1];
        int i=0;
        while(*str!=NULL){
           // puts(str);
            if(*str!=' '){
                ch[i++]=*str;
            }
            else {
                ch[i++]='%';
                ch[i++]='2';
                ch[i++]='0';
            }
            str++;//字符指针后移一位
        }
        ch[i]='\0';
        //puts(ch);
        str=&ch[0];
        //*str=ch[0];
        puts(str);
	}
};*/

class Solution {
public:
	void replaceSpace(char *str,int length) {
        char *p = new char[3*strlen(str)+1];//*
        char *tmp=p;
        for(int i=0; str[i]!='\0'; i++,p++){
            if(str[i]!=' '){
                *p=str[i];
                //puts(p);
            }
            else {
                *p++ ='%';
                *p++ ='2';
                *p='0';
            }
            if(i==0){
                tmp=p;
            }
        }
        
        p=NULL;
        str=tmp;
        //puts(str);
	}
};

int main()
{
    Solution s;
    char *str="Hello World";
    s.replaceSpace(str,11);
    puts(str);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值