zoukankan      html  css  js  c++  java
  • 【剑指Offer面试题】 九度OJ1510:替换空格

    c/c++ 中的字符串以“”作为结尾符。这样每一个字符串都有一个额外字符的开销。

    以下代码将造成内存越界。
    char str[10];
    strcpy(str, “0123456789”);

    为了节省内存。c/c++ 会把常量字符串放到单独的一个内存区域。当几个指针赋予同样的常量字符串时,它们实际上会指向同样的内存地址。


    题目链接地址:
    http://ac.jobdu.com/problem.php?pid=1510

    替换空格

    时间限制:1 秒内存限制:128 兆特殊判题:否提交:9648解决:2483
    题目描写叙述:
    请实现一个函数。将一个字符串中的空格替换成“%20”。比如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
    输入:
    每一个输入文件仅包括一组測试例子。


    对于每组測试案例,输入一行代表要处理的字符串。


    输出:
    相应每一个測试案例,出经过处理后的字符串。
    例子输入:
    We Are Happy
    例子输出:
    We%20Are%20Happy


    《剑指offer》中分析的非常具体:
    1. 假设从前往后找空格。遇到空格时将后面的字符后移,这样后面的字符会多次移动。


    2. 假设先计算出空格数目,从后往前,就能够实现一个字符仅仅移动一次。学会转换思路。

    /********************************* 
    ----------------------------------- 
    【剑指Offer面试题】替换空格
    ----------------------------------- 
    Author:牧之丶  Date:2015年
    Email:bzhou84@163.com 
    **********************************/ 
    #include <stdio.h>
    #include <cstring>
    #include <string>
    #include <iostream>  
    using namespace std;  
    void ReplaceBlank(char *str)  
    {  
        if(str == NULL)  
            return;  
        int len = strlen(str);      //碰到第一个字符串结束符''为止,然后返回计数器值(长度不包括“”)
        if(len == 0)  
            return;  
        int i,count = 0;  
        for(i=0;i<len;i++)  
            if(str[i] == ' ')  
                count++;  
        //没有空格,就直接返回str  
        if(count == 0)  
            return;
        int new_len = 2*count+len;  
        int indexOflen=len;
        int indexOfnew_len=new_len;
        while(indexOflen>=0&&indexOfnew_len>indexOflen)
        {
            if (str[indexOflen]==' ')
            {
                str[indexOfnew_len--]='0';
                str[indexOfnew_len--]='2';
                str[indexOfnew_len--]='%';
            } 
            else
            {
                str[indexOfnew_len--]=str[indexOflen];
            }
            --indexOflen;
        } 
    }  
    
    int main()  
    {  
        static char str[10000002];  
        gets(str);
        ReplaceBlank(str);  
        puts(str);  
        return 0;  
    }  
    /**************************************************************
        Problem: 1510
        Language: C++
        Result: Accepted
        Time:20 ms
        Memory:11284 kb
    ****************************************************************/

    注意点:

    - string转char *

    #include <iostream>
    #include <string>
    using namespace std;
    
    int main()
    {
        string str1="Hello";
        char *str2=const_cast<char*>(str1.c_str());
        cout<<str2;
        return 0;
    }

    - 假设完毕这道题,非常easy方法是遇到非空格就输出。遇到空格就输出“%20”。

    #include <cstdio>  
    #include <iostream>  
    #include <string>  
    
    using namespace std;  
    
    int main()  
    {  
        char str[10000002];  
        while(gets(str))  
        {     
            int i=0;  
            while(str[i]!='')  
            {  
                 if(str[i]==' ') cout<<"%20";  
                 else cout<<str[i];  
                 i++;                   
            }     
            cout<<endl;               
        }     
        return 0;  
    }   
    /**************************************************************
        Problem: 1510
        Language: C++
        Result: Accepted
        Time:20 ms
        Memory:11212 kb
    ****************************************************************/
  • 相关阅读:
    HTTp状态详解
    考虑实现一个web报表制作工具
    UCML编译型应用框架快速开发工具体系介绍
    SQL Server 2000 SP4发布
    有几个mywallop的邀请,想要看看的给我留言吧
    写给刚接触Web Service的朋友
    国内完全免费的电子书籍下载,大家可以上去淘淘宝
    c#高性能在WEB端产生验证图片
    在.net中使用xmlhttp组件读取网页源码
    Oracle经典书籍介绍
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7271845.html
Copyright © 2011-2022 走看看