题目描述
请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。
解题思路
老实说,看到这个题目想到的就是字符串替换,但是面试题肯定不是这么简单的,那么怎么在原字符串上进行高效的替换呢?我们的字符串替换,主要的消耗是在移位上,每遇到一个空格,后面的字符串就往后移位,那么之前的移位都没有作用了。我们知道字符串的长度,知道替换字符串的长度,如果还知道空格的多少,那么这个字符串的长度就知道了。知道长度之后,只需要把数据放到响应的位置就可以了。
步骤:
1. 遍历字符串,统计出空格数量
2. 再遍历一次,完成替换
代码实现
普通解法,直接替换字符串
public static string ReplaceSpaceForSimple(stringstr)
{return str.Replace(" ", "%20");
}
精妙解法数据移位
public static string ReplaceSpace(stringstr)
{int count = 0;foreach (var item instr)
{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(stringstr) {
StringBuilder sb= newStringBuilder();foreach (var item instr) {if (item == ' ')
{
sb.Append("%20");
}else{
sb.Append(item);
}
}returnsb.ToString();
}
测试
中间空格
[Fact]public voidMiddle()
{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 voidStart()
{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 voidEnd()
{string str = "We Are Happy.";
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}
多空格
[Fact]public voidMore()
{string str = "We Are Happy.";
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceSpace(str));
Assert.Equal(Coding002.ReplaceSpaceForSimple(str), Coding002.ReplaceForBS(str));
}
空字符串
[Fact]public voidEmpty()
{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[]
3. 熟悉字符串string,stringbuilder