-
-
Save DC-Shi/2228463 to your computer and use it in GitHub Desktop.
模拟微面试之去空格
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//请实现下面的函数,输入参数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)); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
采用了单次循环,多使用了一个变量。不保留原字符串。++怕掌握不准,索性就分开写了。