面试题002字符串替换空格精妙解法

Posted zhao123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题002字符串替换空格精妙解法相关的知识,希望对你有一定的参考价值。

题目描述

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

解题思路

老实说,看到这个题目想到的就是字符串替换,但是面试题肯定不是这么简单的,那么怎么在原字符串上进行高效的替换呢?我们的字符串替换,主要的消耗是在移位上,每遇到一个空格,后面的字符串就往后移位,那么之前的移位都没有作用了。我们知道字符串的长度,知道替换字符串的长度,如果还知道空格的多少,那么这个字符串的长度就知道了。知道长度之后,只需要把数据放到响应的位置就可以了。
步骤:
1. 遍历字符串,统计出空格数量
2. 再遍历一次,完成替换

代码实现

普通解法,直接替换字符串

public static string ReplaceSpaceForSimple(string str)

    return str.Replace(" ", "%20");

精妙解法数据移位

public static string ReplaceSpace(string str)

    int count = 0;
    foreach (var item in str)
    
        if (item ==  )
        
            count++;
        
    

    int oLength = str.Length;
    int length = oLength + count * 2; //"%20".Length-1
    char[] tempArray = new char[length]; //新开辟了一个空间
    length--;
    for (int i = oLength - 1; i >= 0; i--)
    
        if (str[i] ==  )
        
            tempArray[length--] = 0;
            tempArray[length--] = 2;
            tempArray[length--] = %;
        
        else
        
            tempArray[length--] = str[i];
        
    

    return new string(tempArray);

赋值给另外一个

public static string ReplaceForBS(string str) 
    StringBuilder sb = new StringBuilder();
    foreach (var item in str) 
        if (item ==  )
        
            sb.Append("%20");
        
        else 
            sb.Append(item);
        
    
    return sb.ToString();

测试

中间空格

技术图片
[Fact]
public void Middle()

    string str = "We Are Happy.";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
View Code

开始空格

技术图片
[Fact]
public void Start()

    string str = " We Are Happy.";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
View Code

结束空格

[Fact]
public void End()

    string str = "We Are Happy. ";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));

多空格

[Fact]
public void More()

    string str = "We     Are  Happy.";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));

空字符串

技术图片
[Fact]
public void Empty()

    string str = "";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));

    str = " ";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));

    str = "  ";
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
    Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
View Code

结果

技术图片

想入非非:扩展思维,发挥想象

1. 这个题可以扩展为替换其他的数据,不要局限于单一的替换,URL就是ASCII替换
2. 字符串是一种特殊的char[]

以上是关于面试题002字符串替换空格精妙解法的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer算法编程题目部分汇总(解法略)

剑指offer字符串面试题 替换空格

面试题5:替换空格

剑指offer面试题 5. 替换空格

剑指offer字符串面试题 替换空格

面试题05:替换空格(C++)