我正在使用老虎机并面临收集结果结果的问题。问题是在2D int数组中收集重复值索引的最快方法是什么?这里的条件是,以收集值的仅idexes其中发生5倍在二维int数组算法中收集重复值的索引
CASE 1
输入(获取值只的索引):
int[][] input = new int[][]{
new int[]{1, 2, 3, 4, 8},
new int[]{6, 3, 2, 3, 5},
new int[]{3, 9, 7, 1, 3}
};
预期输出:
[2, 1, 0, 1, 2]
CASE 2
输入(获取的和值仅索引):
int[][] input = new int[][]{
new int[]{1, 5, 3, 5, 8},
new int[]{5, 3, 5, 3, 5},
new int[]{3, 9, 7, 1, 3}
};
预期输出:
[2, 1, 0, 1, 2] //for 3 value
[1, 0, 1, 0, 1] //for 5 value
我的解决方案(其相当差)
1)收集重复(为CASE 2)
Map<Integer, Integer> amountMap = new HashMap<>();
for (int[] row : railSpin) {
for (int value : row) {
amountMap.put(value, amountMap.containsKey(value) ? amountMap.get(value) + 1 : 1);
}
}
2)这一个不工作除去非5场比赛
if (amountMap.containsValue(5)) {
Iterator<Integer> amountIterator = amountMap.values().iterator();
while (amountIterator.hasNext()) {
if (amountIterator.next() != 5) {
amountIterator.remove();
}
}
}
3)迭代倒置并收集索引
List<Integer> indexes = new ArrayList<>();
for (int row = 0; row < 5; row++) {
for (int col = 0; col < railSpin.length; col++) {
int valueToCheck = railSpin[col][row];
if (amountMap.keySet().contains(valueToCheck)) {
indexes.add(col);
}
}
}
4)如果需要分割阵列
List<List<Integer>> splitResults = new ArrayList<>();
for (int start = 0; start < indexes.size(); start += 5) {
int end = Math.min(start + 5, indexes.size());
List<Integer> sublist = indexes.subList(start, end);
splitResults.add(new ArrayList<>());
splitResults.get(start /5).addAll(sublist);
}
您能否建议一个没有太多迭代的解决方案,哪个适合CASE 2?我相信在计算器的功率
我假设你的二维数组由3是固定大小5,对不对?数字也在1到9的范围内? – dasblinkenlight
@dasblinkenlight没错。虽然我试图为5x3和3x3二维数组创建通用算法。高度是恒定的,但宽度可能不同 – AnZ