我需要比較猜測和代碼陣列并計算猜測中正確數字的數量。
它一直有效,直到代碼陣列中有重復的數字。我知道這與第二個 for 回圈和從正確數字中減去有關。
public static int digits(int[] code, int[] guess) {
int digits = 0;
for (int i = 0; i < code.length; i ) {
for (int j = 0; j < guess.length; j ) {
if (guess[j] == code[i]) {
digits ;
break;
}
}
}
for (int i = 0; i < code.length; i ) {
for (int j = i 1; j < code.length; j ) {
if (code[i] == code[j] && code[i] != guess[j] && code[j] != guess[i]) {
digits--;
}
}
}
return digits;
}
uj5u.com熱心網友回復:
由于您提到“僅使用回圈和基本知識”,我假設此處不包括地圖等概念,“基本知識”表示“陣列”。
如果您只需要知道位數,請嘗試將您的輸入轉換為 10 元素的計數陣列,即每個數字都是輸入。
例子:
int[] codeDigits = new int[10];
for (int i = 0; i < code.length; i ) {
codeDigits[code[i]] ;
}
這將[5,9,9,9]變成[0,0,0,0,0,1,0,0,0,3], 即 5: 1x, 9: 3x
現在也為猜測執行此操作,例如[0,0,9,9]變為[2,0,0,0,0,0,0,0,0,2]。
現在您所要做的就是計算位數:
int counter = 0;
for( int i = 0; i < codeDigits.length; i ) {
if( codeDigits[i] >= guessDigits[i] ) {
counter = guessDigits[i]; //guessed the exact number or less -> use the guess
} else {
counter = codeDigits[i]; //guessed more -> use the code
}
}
如果您能夠使用Math函式,則可以將回圈體替換為counter = Math.min(codeDigits[i], guessDigits[i]);.
再來一張插圖(用更長的代碼更好地說明):
code: [5,0,9,9,1,7,1] -> [1,2,0,0,0,1,0,1,0,2]
guess: [9,9,0,9,7,4,2] -> [1,0,1,0,1,0,0,1,0,3]
-----------------------------------------
minimum of each digit: 1,0,0,0,0,0,0,1,0,2
如果將這些最小值相加,您將得到 4 個正確數字:1x 0、1x 7、2x 9
uj5u.com熱心網友回復:
有幾種解決方案。其中一個是索引代碼陣列的重復值,然后在第一個回圈中檢查它們(并洗掉第二個回圈):
int correctDigits = 0;
int[] duplicateIndexes = new int[code.length];
for (int i=0; i < code.length; i ) {
if( duplicateIndexes[i] == 1) continue;
for (int j=0; j < code.length; j ) {
if( core[i] == core[j]) {
duplicateIndexes[j] == 1;
continue;
}
}
}
for (int i = 0; i < code.length; i ) {
if (duplicatedIndexes[i] == 1) continue;
for (int j = 0; j < guess.length; j ) {
if (guess[j] == code[i]) {
correctDigits ;
break;
}
}
}
uj5u.com熱心網友回復:
您可以從這些陣列中生成兩個 Map,它們將 Value 與其出現次數相關聯。
然后遍歷從code陣列中獲得的 Map 的條目,并將其值與基于陣列創建的 Map中的相應值guess進行比較。這將允許確定正確/錯誤猜測的數量。
uj5u.com熱心網友回復:
我希望這會奏效。
代碼
public static int getCorrectDigits(int[] code, int[] guess) {
if (code.length != guess.length) {
throw new IllegalArgumentException("Different lengths");
}
int correctDigits = 0;
for (int i = 0; i < code.length; i ) {
if (guess[i] == code[i]) {
correctDigits ;
}
}
return correctDigits;
}
輸出
Code - 5 9 9 9
Guess - 0 9 9 9
Passes - 3
Code - 5 9 9 9
Guess - 9 9 0 0
Passes - 1
Code - 5 9 9 9
Guess - 0 0 9 9
Passes - 2
Code - 5 9 9 9
Guess - 9 0 0 0
Passes - 0
uj5u.com熱心網友回復:
您需要更改 for 回圈以迭代猜測而不是迭代代碼陣列:
public static int getCorrectDigits(int[] code, int[] guess) {
if (code.length != guess.length) {
throw new IllegalArgumentException("Different lengths");
}
int correctDigits = 0;
for (int i = 0; i < guess.length; i ) {
for (int j = 0; j < code.length; j ) {
if (guess[i] == code[j]) {
correctDigits ;
break;
}
}
}
return correctDigits;
@Test
void ex1() {
assertEquals(3, ArrayComp.getCorrectDigits(new int[] {5,9, 9, 9}, new int[] {0,9,9,9}));
} @Test
void ex2() {
assertEquals(2, ArrayComp.getCorrectDigits(new int[] {5,9, 9, 9}, new int[] {9,9,0,0}));
} @Test
void ex3() {
assertEquals(2, ArrayComp.getCorrectDigits(new int[] {5,9, 9, 9}, new int[] {0,0,9,9}));
} @Test
void ex4() {
assertEquals(1, ArrayComp.getCorrectDigits(new int[]{5, 9, 9, 9}, new int[]{9, 0, 0, 0}));
}
uj5u.com熱心網友回復:
我想我會參與其中 - 維護一個code使用的布爾數字陣列,只需要一個嵌套回圈并反轉回圈順序:
public static int getCorrectDigits(int[] code, int[] guess) {
if (code.length != guess.length) {
throw new IllegalArgumentException("Different lengths");
}
int correctDigits = 0;
boolean[] used = new boolean[code.length];
for (int i = 0; i < guess.length; i ) {
for (int j = 0; j < code.length; j ) {
if (guess[i] == code[j] && !used[j]) {
correctDigits ;
used[j] = true;
break;
}
}
}
return correctDigits;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/516730.html
標籤:爪哇数组测试数数重复
上一篇:在AzurePipelines.yml檔案中使用(任務:DotNetCoreCLI@2)是否可以添加一個引數來重新運行失敗的測驗
