我正在编写一个简单的编程面试问题,从输入字符串中删除一组不允许的字符。
有经验的人能否告诉我基础数据中发生了什么,导致这种比较失败?
using System;
using System.Collections.Generic;
class Solution {
public static void Main() {
var str = "hello world";
var rmv = "aeiou";
var res = Remove(str, rmv);
Console.WriteLine(res);
if(res == "hll wrld") Console.WriteLine("test 1 pass");
else Console.WriteLine("test 1 fail");
}
public static string Remove(string input, string rmv) {
var blacklist = new Dictionary<char, int>();
for(int i = 0; i < rmv.Length; i++) {
blacklist[rmv[i]] = 1;
}
// max length
var charArray = new char[input.Length];
var j = 0;
for(int i = 0; i < input.Length; i++) {
if(!blacklist.ContainsKey(input[i])) {
charArray[j] = input[i];
j++;
}
}
return new string(charArray);
}
}
输出:
9:05pm - me running 40 lines of C#
hll wrld
test 1 fail
为什么在使用具有null元素的char数组来构建字符串时它会失败?有趣的是,使用String.Compare(res, "hll wrld") == 0
答案 0 :(得分:2)
问题是因为"hll wrld" !== "hll wrld\0\0\0"
的初始化长度与输入字符串的长度相同。由于您要删除元音,因此每个元音的字符数组都包含空字符。
使用调试器,您可以看到\0
。如果有3 charArray
个,则删除每个元音一个。您需要return new string(charArray).Replace("\0", "");
不包含这些空字符。
解决此问题的一种方法是将return语句更改为以下内容:
var str = "hello world";
var rmv = new HashSet<char>("aeiou".ToArray());
var res = new string(str.Where(x => !rmv.Contains(x)).ToArray());
但是,我建议使用这个简单的LINQ单行代码而不是Remove()方法。 HashSet使对Contains的调用为O(1)。
200 * 100