我正在使用老虎機並面臨收集結果結果的問題。問題是在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