电话号码列表保持一致

时间:2017-05-02 13:11:50

标签: c#

你好stackoverflow的人

我有一个问题,我不知道如何解决,我需要帮助:

写入功能,将分析电话号码列表并确定它是否一致,就像没有电话号码是列表中另一个电话号码的前缀一样。

看一下这个例子:

Information 988
Mike 43722451
Steven 98816740

在上面的示例中,我们无法联系到Steven,因为电信中心会在您输入988时将我们引导至信息线,这恰好是史蒂文电话号码的前3位数字。所以这个列表不一致。

假设输入是字符串列表,其中每个字符串的最大长度为10个字符。您可以使用您熟悉的任何语言编写代码。

....这是面试,因为你认为我没有解决它,所以如果有人能做到这一点并给我一点解释,它会对我有很多帮助..

2 个答案:

答案 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);
}

打印98862615