【发布时间】:2010-11-16 10:04:30
【问题描述】:
有多个相关问题,但我正在寻找针对我的案例的解决方案。有一个(通常)14 个整数的数组,每个整数的范围在 1 到 34 之间。如何快速判断特定静态列表中的每个 int 是否在该数组中至少出现一次?
作为参考,我目前正在使用这段代码,它被编写为尽可能接近规范,因此它当然可以大大改进:
if (array.Count < 13) {
return;
}
var required = new int[] {
0*9 + 1,
0*9 + 9,
1*9 + 1,
1*9 + 9,
2*9 + 1,
2*9 + 9,
3*9 + 1,
3*9 + 2,
3*9 + 3,
3*9 + 4,
3*9 + 5,
3*9 + 6,
3*9 + 7,
};
IsThirteenOrphans = !required.Except (array).Any ();
所需的列表不是动态的,即它在运行时总是相同的。使用 Linq 是可选的,主要方面是性能。
编辑:
- 输入数组未排序。
- 输入值可能会出现多次。
- 输入数组将包含至少 14 个项目,即比所需数组多 1 个。
- 只有 1 个必需的数组,它是静态的。
- required 中的值是不同的。
- 您可能会认为创建直方图的成本很低。
更新:我也对排序输入数组的解决方案感兴趣。
【问题讨论】:
-
这14个整数是否不同?
-
我认为您的代码也有错误。如果
required包含重复但array不包含某个 int,它将通过您的测试。 -
@Code 确实,我忘了说
required不包含骗子。 -
附带说明,如果您在每微秒之后,一个普通的 for 循环比 foreach 更快。
-
我的算法是 O(n + 34) 而不是 34 * n 你看到了吗,考虑一下?如果没有,我会删除它。
标签: c# .net algorithm list mahjong