Skip to content

Instantly share code, notes, and snippets.

@DC-Shi
Forked from Ninputer/RemoveMultipleSpaces.cs
Created March 28, 2012 17:30
Show Gist options
  • Save DC-Shi/2228463 to your computer and use it in GitHub Desktop.
Save DC-Shi/2228463 to your computer and use it in GitHub Desktop.
模拟微面试之去空格
//请实现下面的函数,输入参数baseStr是一个(可以更改的)字符串,请将其中所有连续出现的多个空格都替换成一个空格,单一空格需保留。
//请直接使用baseStr的空间,如需开辟新的存储空间,不能超过o(N)(注意是小o,N是字符串的长度)。返回值是替换后的字符串的长度。
//样例代码为C#,但可以使用任何语言。如需使用任何库函数,必须同时给出库函数的实现。
class Program
{
public static int RemoveMultipleSpaces(char[] baseStr)
{
if (baseStr == null) return 0;
int idx = 0, pointer = 0; // 循环变量和指向缩减过的位置;
bool isSpaceEntered = false;
for (idx = 0; idx < baseStr.Length; )
{
if (baseStr[idx] != ' ')
{
if (pointer < idx)
baseStr[pointer] = baseStr[idx];
idx++;
pointer++;
isSpaceEntered = false;
continue;
}
else
{
if (isSpaceEntered) // 当前已经不是第一个空格了,所以忽略,跳至下一个
{
idx++;
continue;
}
else
{
isSpaceEntered = true;
if (pointer < idx)
baseStr[pointer] = baseStr[idx];
idx++;
pointer++;
}
}
}
return pointer;// 返回值是新字符串的长度,原字符串依然可以访问到这之后的位置。
}
}
//样例测试程序(请自行补充更多的测试案例)
[TestFixture]
public class ScannersTest
{
[Test]
public void RemoveOneInnterSpaceBlockTest()
{
char[] input = "abc def".ToCharArray();
int resultLength = Program.RemoveMultipleSpaces(input);
Assert.AreEqual(7, resultLength);
Assert.AreEqual("abc def", new string(input, 0, resultLength));
}
[Test]
public void RemoveTwoInnterSpaceBlocksTest()
{
char[] input = "abc def ghi".ToCharArray();
int resultLength = Program.RemoveMultipleSpaces(input);
Assert.AreEqual(11, resultLength);
Assert.AreEqual("abc def ghi", new string(input, 0, resultLength));
}
[Test]
public void KeepSingleSpaceTest()
{
char[] input = " a b d e ".ToCharArray();
int resultLength = Program.RemoveMultipleSpaces(input);
Assert.AreEqual(9, resultLength);
Assert.AreEqual(" a b d e ", new string(input, 0, resultLength));
}
[Test]
public void AllSpacesTest()
{
char[] input = " ".ToCharArray();
int resultLength = Program.RemoveMultipleSpaces(input);
Assert.AreEqual(1, resultLength);
Assert.AreEqual(" ", new string(input, 0, resultLength));
}
}
@DC-Shi
Copy link
Author

DC-Shi commented Mar 28, 2012

采用了单次循环,多使用了一个变量。不保留原字符串。++怕掌握不准,索性就分开写了。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment