字符串数组搜索
Posted
技术标签:
【中文标题】字符串数组搜索【英文标题】:String Array Searching 【发布时间】:2014-10-06 20:37:38 【问题描述】:几天前我面试了一个初级开发人员职位,他们问:
“如果你有一个由字母“a”和“b”组成的数组,你将如何编写一个方法来计算这些字母在数组中有多少个实例?”
我说过你会有一个 for loop
和一个 if else
语句,它将增加 2 个计数器变量中的 1 个。不过,在那之后,他们问我如何解决同样的问题,如果数组可以包含字母表中的任何字母。我说过我会以同样的方式去做,用很长的IF
声明或switch
声明。事后看来,这似乎没有那么有效。有没有更简单的方法来做到这一点?
【问题讨论】:
【参考方案1】:您可以将大小为 256(可能的字符代码数)的数组声明为零,然后简单地增加与您读取的字符代码相对应的数组。
例如,如果您正在读取“a”,则相应的代码是 ASCII 97,因此您增加数组 [97],您可以优化内存量,将代码减少 97(如果您知道输入将是字符仅)您还需要知道如何处理大写字符(您是否将它们简化为不同)同样在这种情况下,您需要注意将字符减少 65。
所以最后的代码应该是这样的:
int counts[122 - 97] = 0; // codes of a - z
char a = get_next_char();
if ( is_capital(a))
counts[a - 65]++;
else
counts[a - 97] ++;
此代码假定 'A' = 'a' 如果不是这种情况,您需要在 if 中进行不同的翻译,但您现在可能会弄清楚这个想法。与您的方法相比,这节省了很多比较。
【讨论】:
【参考方案2】:根据目标是 CPU 效率、内存效率还是开发人员效率,您可以这样做:
foreach(var grp in theString.GroupBy(c => c))
Console.WriteLine("0: 1", grp.Key, grp.Count());
效率不高,但几乎适用于非病理情况。在实际场景中,由于 unicode,我可能会使用字典作为计数器 - unicode 对于预分配数组来说太大了。
Dictionary<char, int> counts = new Dictionary<char, int>();
foreach(char c in theString)
int count;
if(!counts.TryGetValue(c, out count)) count = 0;
counts[c] = count + 1;
foreach(var pair in counts)
Console.WriteLine("0: 1", pair.Key, pair.Value);
【讨论】:
【参考方案3】:您可以创建Dictionary<string, int>
,然后遍历数组,检查元素是否作为字典中的键存在并增加值。
Dictionary<string, int> counter = new Dictionary<string, int>();
foreach(var item in items)
if(counter.ContainsKey(item))
counter[item] = counter[item] + 1;
【讨论】:
这会导致字典为空,不是吗? 是的,但这只是解决问题的想法。您可以添加这样的 else 语句else counter[item] = 1;
@MarcGravell【参考方案4】:
这是一个很好的例子,它可能会解决你的问题。
http://www.dotnetperls.com/array-find
string[] array1 = "cat", "dog", "carrot", "bird" ;</br>
//
// Find first element starting with substring.
//
string value1 = Array.Find(array1,
element => element.StartsWith("car", StringComparison.Ordinal));</br>
//
// Find first element of three characters length.
//
string value2 = Array.Find(array1,
element => element.Length == 3);
//
// Find all elements not greater than four letters long.
//
string[] array2 = Array.FindAll(array1,
element => element.Length <= 4);
Console.WriteLine(value1);
Console.WriteLine(value2);
Console.WriteLine(string.Join(",", array2));
【讨论】:
以上是关于字符串数组搜索的主要内容,如果未能解决你的问题,请参考以下文章