对于c#中的整数数组(可能更好地将它们视为字符串)执行以下操作可能是最佳解决方案:
示例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)
如何懒惰并只使用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());
答案 1 :(得分: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)
答案 2 :(得分:0)
创建十分支索引树,记录每个节点的子节点数。 然后浏览树,停在子编号为10的节点上。