面试之路(20)-字符串中空格替换一类问题详解

题目描述

实现一个函数,把字符串中的空格替换为%20,例如“we are happy”,转换为“we%20are%20happy”

思路分析:

  • 遍历的方法,时间复杂度是n×n
  • 采用双指针,从后往前复制数组,遍历统计空格,每增加一个空格,数组长度增加2,设置联两个指针p1,p2,p1指向旧数组的末尾,p2指向新数组的末尾,根据末尾是否是空格分类复制

代码:

public void replaceBlank(char string[],int length){
        if(string == null || length <= 0){
            return;
        }
        //保存字符串的实际长度
        int originLength = 0;
        int numberOfBlank = 0;
        int i  = 0;
        while(string[i] != '\0'){
            ++originLength;
            if(string[i] == ' '){
                ++numberOfBlank;
            }
            i++;
        }
        int newLength = originLength + numberOfBlank*2;
        //在剑指offer中,此处是newLength > length,我感觉是它错了,欢迎指正
        if(newLength + 1 > length){
            return;
        }
        int indexOld = originLength;
        int indexNew = newLength;
        //剑指offer中这里是>,我是>=
        while(indexOld > 0 || indexNew >= indexOld){
            if(string[indexOld] == ' '){
                string[indexNew--] = '0';
                string[indexNew--] = '2';
                string[indexNew--] = '%';
            }else{
                string[indexNew--] = string[indexOld];
            }
            indexOld--;
        }
    }

测试用例

  • 输入空格在最前,最后,中间,连续
  • 不含空格
  • 字符串是null,内容是空,只保含空格

相似问题:

两个已经排序数组a1,a2,假设a1的空间足够大,a2插入a1

总结:

合并或者插入数组或者字符串,从后往前,采用双指针
本文是看完剑指offer整理写成,有部分不同,有待确认。

你可能感兴趣的:(面试,Class,合并数组,去空格,合并字符串)