你好stackoverflow的人
我有一个问题,我不知道如何解决,我需要帮助:
写入功能,将分析电话号码列表并确定它是否一致,就像没有电话号码是列表中另一个电话号码的前缀一样。
看一下这个例子:
Information 988
Mike 43722451
Steven 98816740
在上面的示例中,我们无法联系到Steven,因为电信中心会在您输入988时将我们引导至信息线,这恰好是史蒂文电话号码的前3位数字。所以这个列表不一致。
假设输入是字符串列表,其中每个字符串的最大长度为10个字符。您可以使用您熟悉的任何语言编写代码。
....这是面试,因为你认为我没有解决它,所以如果有人能做到这一点并给我一点解释,它会对我有很多帮助..
答案 0 :(得分:3)
我建议按字典顺序对集合进行排序,然后扫描它:
// let's for instance, organize numbers as an array
string[] numbers = new string[] {
"988", // <- this is a prefix of "98816740"
"43722451",
"98816740", // <- has a prefix "988" which is within the collection
"123",
"456",
};
Array.Sort(numbers);
for (int i = 1; i < numbers.Length; ++i)
if (numbers[i].StartsWith(numbers[i - 1])) {
//TODO: Conflict found, put relevant code here
Console.WriteLine("{0} is a prefix of {1}", numbers[i - 1], numbers[i]);
}
如您所见,算法的复杂度为O(n * log(n))
。
修改:在一般情况下,如果您获得string
,则必须提取功能(name
和{{ 1}}),例如使用正则表达式:
number
结果:
string data = "Information 988 Mike 43722451 Steven 98816740";
var records = Regex
.Matches(data, @"(?<name>\w+)\s*(?<number>[0-9]+)")
.OfType<Match>()
.Select(match => new {
name = match.Groups["name"].Value,
number = match.Groups["number"].Value, })
.OrderBy(item => item.number)
.ToArray();
for (int i = 1; i < records.Length; ++i) {
if (records[i].number.StartsWith(records[i - 1].number)) {
// records[i - 1] number is a prefix of records[i] number
//TODO: put relevant code here
Console.WriteLine("\"{0}\" conflicts with \"{1}\": {2} is a prefix of {3}",
records[i - 1].name, records[i].name, records[i - 1].number, records[i].number);
}
}
答案 1 :(得分:2)
var numbers = new List<string> {
"988",
"1234567",
"988448484",
"62615",
"6261545"
};
foreach(var s in numbers) {
if (numbers.Any(x => x.StartsWith(s) && x != s))
Console.WriteLine(s);
}
打印988
和62615