面试题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;
    }
}

四.本题考点

  • 考查应聘者对字符串的编程能力
  • 考查应聘者分析时间效率的能力。我们能清晰的分析出两种不同的方法的时间效率各是多少。
  • 考查应聘者对内存覆盖是否有高度的警惕。在分析得知字符串会改变之后,我们能够意识到潜在的问题 ,并主动和面试官沟通以寻找问题的解决方案。
  • 考查应聘者的思维能力。从前到后替换的思路被面试官否定之后,我们能迅速的想到从后往前替换的方法,这是解决问题的关键。
原文地址:https://www.cnblogs.com/ovs98/p/9855162.html