假设我有一个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)
应该返回{01,...,18,19,31,32,...,98,99}
这不是一个功课,我已经通过制作所有数字并将每个数字与输入进行比较并获得更改数量来实现这一点,但这种方法在数字较大的数字中存在性能问题。
答案 0 :(得分:4)
这看起来与数字无关。您有一个字符串,并且您希望使用有限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();
}
(我没有测试代码,所以它可能包含一些小错误)