题目1510:替换空格

6 篇文章 0 订阅
题目描述:

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

输入:

每个输入文件仅包含一组测试样例。
对于每组测试案例,输入一行代表要处理的字符串。

输出:

对应每个测试案例,出经过处理后的字符串。

样例输入:
We Are Happy
样例输出:
We%20Are%20Happy

这是剑指offer上面的一道题目,被九度改编成了上机题。
如果要单纯的完成这道题,有个很简单的思路就是,遇到非空格就输出,遇到空格就输出“%20”。对应代码是这样的:

#include <iostream>
#include <string>
#include <cstdio>
 
using namespace std;
 
int main()
{
    char str[10000001];
    while(gets(str))
    {   
        int i=0;
        while(str[i]!='\0')
        {
             if(str[i]==' ') cout<<"%20";
             else cout<<str[i];
             i++;                 
        }   
        cout<<endl;             
    }   
    return 0;
} 
/**************************************************************
    Problem: 1510
    User: 小燧石
    Language: C++
    Result: Accepted
    Time:20 ms
    Memory:11216 kb
****************************************************************/
但是,很明显这是一种投机取巧的办法,不是题目的本意。我想题目的本意应该是不使用其他的缓冲区,将这样的字符串转存为题目中的形式。
《剑指offer》中分析的很清楚,如果从前往后找空格,遇到空格时将后面的字符后移,这样后面的字符会多次移动,影响效率。如果先计算出空格数目,从后往前,就可以实现一个字符只移动一次。转换一个思路。效率会大增,上代码:
#include <iostream>
#include <string.h>
#include <cstdio>
 
usingnamespace std;
 
charstr[10000001];
 
intmain()
{
    
    while(gets(str))
    {  
        intnum=0,len=0;
        len = strlen(str);
        for(inti=0;i<len;i++)
        {
            if(str[i]==' ') num++;        
        } 
         
        for(inti=len-1;i>=0;i--)
        {
             str[i+num*2] = str[i];
             if(str[i]==' ')
             {
                 str[i+num*2]='0';
                 str[i+num*2-1]='2';
                 str[i+num*2-2]='%';
                 num--; 
             }    
        } 
         
        len = strlen(str);
        for(inti=0;i<len;i++)
        {
            cout<<str[i];      
        } 
        cout<<endl;
            
    }  
    return0;
}
 
/**************************************************************
    Problem: 1510
    User: 小燧石
    Language: C++
    Result: Accepted
    Time:30 ms
    Memory:11284 kb
****************************************************************/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值