2012-11-21 76 views
1

什麼可以做以下到一個整數數組(可更好地將它們視爲串)在C#的最佳解決方案:減少整數如果覆蓋0-9

實施例1:

陣列包括:

440 - 441 - 442 - 443 - 444 - 445 - 446 - 447 - 448 - 449 - 51 - 9876 

結果應該是:

44 - 51 - 9876 

應用的規則441至449以44替換,因爲我們有一整套0 - 9

實施例2

陣列包括:

440 - 441 - 442 - 443 - 444 - 445 - 446 - 447 - 448 - 449 - 40 - 41 - 42 - 43 - 45 - 46 - 47 - 48 - 49 

結果應該是:

4 - 51 - 9876 

應用規則:首先3個字符串(所有以44開頭的字符串)減少到44,然後相同的規則紅色集體企業40〜49〜4

+0

2個空格,然後換行 降價換行 –

+5

排序您的列表,解析連續的數字,摺疊,沖洗並重復,直到找不到更多的更改。 – SinisterMJ

+0

^1並完成。 。 –

回答

2

如何懶惰,只使用LINQ?

int[] arr1 = { 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 51, 9876 }; 

// This is just one reduction step, you would need loop over it until 
// no more reduction is possible. 
var r = arr1.GroupBy(g => g/10). 
     SelectMany(s => s.Count() == 10 ? new int[] {s.Key} : s.AsEnumerable()); 
+0

我正在使用LINQ解決方案(略有不同),但不知道性能! – Asha

0

這是一個使用排序的數據結構,但節省了解決方案的一些排序

僞代碼:

numbers //your array of number 
sortedSet //a sorted data structure initially empty 

function insertSorted (number) { 
    sortedSet.put(number) //simply add the number into a sorted structure 
    prefix = number/10 //prefix should be int to truncate the number 

    for (i=0;i<10;i++){ 
    if (! sortedSet contains (prefix * 10 + i)) 
     break; //so i != 10, not all 0-9 occurrences of a prefix found 
    } 
    if (i== 10) {//all occurrences of a prefix found 
    for (i=0;i<10;i++){ 
     sortedSet remove (prefix*10 + i) 
    } 
    insertSorted(prefix) //recursively check if the new insertion triggered further collapses 
    } 
} 

最後,我會叫這樣:

foreach number in numbers 
    insertSorted (number) 
0

創建十分支索引樹,記錄每個節點的子節點數。 然後瀏覽樹,停在子節點號爲10的節點上。