只是在寻找以下问题的最佳方法方面寻求一些帮助:
我有一堆拨打过的电话号码,不要以为你需要我给你看,但是比如说。
006789 1234
006656 1234
006676 1234
006999 1234
007000 1234
006999 6789
现在:我还有一个前缀列表(前缀是首先拨打的位,也告诉你呼叫的去向(重要位))。重要的是 - 它们具有前导0,并且它们具有不同的长度。
比如说。
006789 = australia
006789 = russia
006656 = france
006676 = austria
0069 = brazil
00700 = china
所以我要做的就是编写C#算法来查找要应用的前缀。
逻辑如下工作,比如我们有一个拨打的号码和这些前缀
dialled number:0099876 5555 6565,
prefix1: 0099876 = Lyon (France)
prefix2: 0099 = France
现在两个前缀都适用,除了“更详细的一个”总是获胜。即这个电话是里昂(法国),0099876应该是结果,即使0099也适用。
让我开始使用这个算法的任何帮助都会很棒,因为看着它,我不确定我是否应该比较字符串或整数!我有.Contains
字符串,但正如我的示例中所描述的那样,如果前缀在后面的数字
即
6999 6978
6978 1234
干杯!!!
答案 0 :(得分:8)
看起来对我来说是trie的一个很好的匹配。鉴于你的前缀保证很短,这应该很好,快速搜索。你也可以同时找到所有匹配的前缀。最长的前缀是在trie中匹配的最后一个,并且将是O(m)来查找(最坏情况),其中m是前缀的长度。
答案 1 :(得分:4)
我猜你可以按长度排序你的前缀(最长的)。
然后,当您需要处理一个数字时,您可以按顺序运行前缀,并在yourNumber.startsWith(prefix)
为真时停止。
答案 2 :(得分:3)
找到最长的。使用LINQ:
prefixes.Where(p => number.StartsWith(p)).OrderByDescending(p => p.Length).FirstOrDefault();
答案 3 :(得分:0)
如果您已经知道要查找的前缀,最好使用HashMap(我相信它是C#中的字典)来存储前缀及其对应的国家/地区。然后,对于每个进入的数字,您可以对列表中的所有前缀进行标准搜索。将匹配的列表存储在列表中,然后选择最长的匹配项。
答案 4 :(得分:0)
另一种方法是将拨打的号码从右侧缩短一个,并测试该号码是否在列表中:
Dictionary<string, string> numbers = new Dictionary<string, string>();
//Build up the possible numbers from somewhere
numbers.Add("006789", "australia");
numbers.Add("006790", "russia");
numbers.Add("006656", "france");
numbers.Add("006676", "austria");
numbers.Add("0069", "brazil");
numbers.Add("00700", "china");
numbers.Add("0099876", "Lyon (France)");
numbers.Add("0099", "France");
//Get the dialed number from somewhere
string dialedNumber = "0099 876 1234 56";
//Remove all whitespaces (maybe minus signs, plus sign against double zero, remove brackets, etc)
string normalizedNumber = dialedNumber.Replace(" ", "");
string searchForNumber = normalizedNumber;
while (searchForNumber.Length > 0)
{
if(numbers.ContainsKey(searchForNumber))
{
Console.WriteLine("The number '{0}' is calling from {1}", dialedNumber, numbers[searchForNumber]);
return;
}
searchForNumber = searchForNumber.Remove(searchForNumber.Length - 1);
}
Console.WriteLine("The number '{0}' doesn't contain any valid prefix", dialedNumber);