• 面试题5:替换空格


    一.题目

    请实现一个函数,把字符串中的每个空格替换成“%20”。例如,输入“We are happy!”,则输出“We%20are%20happy!”

    二.思路

    这里替换空格还会造成字符串长度的延长,这是本题的关键。如果是在原来的字符串上做修改,就有可能覆盖修改在该字符后面的内存,如果是创建新的字符串并在新的字符串上进行替换,那么我们可以分配足够多的内存。因而有两种解决方案,我们应该与面试官沟通一下。这里我们假设在原来的字符串上修改,并且保证输入的字符串后面有足够多的空余内存。

    我们首先考虑从前往后扫描,每次遇到空格之后进行替换,但是这样操作的话每次替换都要移动后面的字符,总的时间效率是O(n2),效率太低;于是我们考虑从后往前扫描:

    首先准备两个指针:p1和p2。p1指向原始字符串的末尾,p2指向替换之后字符串的末尾。接下来我们移动p1,如果p1指向的字符不是空格,我们把它指向的字符复制到p2指向的位置,然后p1和p2都向前移动一位;如果p1指向的字符是空格,我们为您首先把p1向前移动一位,然后在p2之前插入“%20”;直到p1指向字符串开头的位置。

    三.代码

    void ReplaceBlank(char string[],int length){
        // string:待替换数组
        // length::数组容量(数组实际长度小于等于容量)
    
        if(string == nullptr || length <= 0)
            return;
    
        int originalLength = 0; //数组实际长度
        int numberOfBlank = 0; //数组空格个数
        int i = 0;
        while(string[i] != ''){
            if(string[i] == ' ')
                ++numberOfBlank;
    
            ++originalLength;
            ++i;
        }
    
        int newLength = originalLength + 2 * numberOfCount;
        if(newLength > length)
            return;
    
        int indexOfOriginal = originalLength;
        int indexOfNew = newLength;
        while(indexOfOriginal >= 0){
            if(string[i] == ' '){
                string[indexOfNew--] = '0';
                string[indexOfNew--] = '2';
                string[indexOfNew--] = '%';
            }
    
            else
                string[indexOfNew] = string[indexOfOriginal];
    
            --indexOfOriginal;
        }
    }

    四.本题考点

    • 考查应聘者对字符串的编程能力
    • 考查应聘者分析时间效率的能力。我们能清晰的分析出两种不同的方法的时间效率各是多少。
    • 考查应聘者对内存覆盖是否有高度的警惕。在分析得知字符串会改变之后,我们能够意识到潜在的问题 ,并主动和面试官沟通以寻找问题的解决方案。
    • 考查应聘者的思维能力。从前到后替换的思路被面试官否定之后,我们能迅速的想到从后往前替换的方法,这是解决问题的关键。
  • 相关阅读:
    解决Python开发中,Pycharm中无法使用中文输入法问题
    PointNet++作者的视频讲解文字版
    StringBuilder
    DropDownList 添加“请选择”
    SQLServer 2008中SQL增强之三 Merge(在一条语句中使用
    ASP.NET Web Forms 的 DI 應用範例
    怎么设置环境变量
    ParameterizedThreadStart,ThreadStart的使用,线程Thread传参数
    异步删除
    SqlCommandBuilder的作用
  • 原文地址:https://www.cnblogs.com/ovs98/p/9855162.html
Copyright © 2020-2023  润新知