字符串数组搜索

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&lt;string, int&gt;,然后遍历数组,检查元素是否作为字典中的键存在并增加值。

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));

【讨论】:

以上是关于字符串数组搜索的主要内容,如果未能解决你的问题,请参考以下文章

Actionscript 3 在数组中搜索字符串

如果我有多个数组并且我想在所有数组中搜索,如何在 java 中搜索字符串?

如何使用 eloquent 在数组数组中搜索字符串

字符串数组的线性搜索[重复]

字符串数组搜索

如何在 C# 中搜索字符串数组中的子字符串