数字的适度变化

本文关键字:变化 数字 | 更新日期: 2023-09-27 18:13:04

假设我有一个7位数的数字。我需要一个这样的函数

List<int> GetVariations(int input, int count)

返回所有可以改变为输入的数字的精确数字变化数等于count的列表;

例如

(为了简单,本例为2位数):

GetVariations(20, 1)应该返回{00、10、30、40、50、60、70、80、90、21、22、23、24、25、26、27、28、29}GetVariations(20, 2)应该返回{1,…,18日,19日,31日,32岁,98年,99}

这不是作业,我已经通过制作所有数字并将每个数字与输入进行比较并获得更改数量来实现此功能,但这种方法在较大数字的数字中存在性能问题。

数字的适度变化

在我看来这与数字无关。你有一个字符串,你想用有限的http://en.wikipedia.org/wiki/Hamming_distance创建变化。

递归地实现这个比较好:

IEnumerable<string> GetVariations(string input, int limit,char[] characters)
{
  if(limit==0)
  {
    yield return input;
    yield break;
  }
  if(limit>input.Length)//Disallows fewer than `limit` changes.
  {
    yield break;
  }
  string remainder=input.SubString(1);
  foreach(char c in characters)
  {
    int remainingLimit;
    if(c==input[0])
      remainingLimit=limit;
    else
      remainingLimit=limit-1;
    foreach(string variedRemainder in GetVariations(remainder,remainingLimit,characters)
      yield return c+variedRemainder;
  }
}
List<int> GetVariations(int input, int count)
{
  return GetVariations(input.ToString(),count,new char[]{'0',...,'9'}).Select(int.Parse).ToList();
}

(我没有测试代码,所以它可能包含一些小错误)