2011-11-01 37 views
2

假設我有一個包含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

Basicall增量由'+ 10'而少'比輸入'還要'+ 1'直到輸入+ 10? – sll

+0

@sll:你如何從'input = 25'和'count = 1'製作21? – HPT

+0

我認爲你的例子有問題。爲了從'20'改變'00'兩次,你可以做'20' - >'10' - >'00'還是'00'只需要從'20'改變一次呢? –

回答

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(); 
} 

(我沒有測試的代碼,所以它可能包含了一些小bug)