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

题目描述

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

解题思路

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

代码实现

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

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();
}

测试

中间空格ui

[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

开始空格spa

[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

结束空格3d

[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));
}

多空格code

[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));
}

空字符串blog

[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[]

相关文章
相关标签/搜索