簡體   English   中英

如何查找元素數組的第一個實例

[英]How to find first instance of element array

我是一個非常基本的程序員,我正在編寫一個'Master-mind'式猜謎游戲程序。

現在我堅持的部分是,當我遇到一個特定的數字時,我想通過一個數組並增加指針。

現在這很容易和東西,但我想要做的只是增加計數器,如果第一次遇到這個數字。 所以,例如,如果有兩個數字(189,999),我希望計數器只增加一次,而不是3次,這就是我的代碼所做的。 我知道它為什么這樣做,但我無法找到一種方法不做它(除了可能聲明一個數組並將所有重復的數字放在那里,只有在沒有數字匹配時才增加它,但這樣效率極低這是我的代碼:

for (int i = 0; i < mString.length(); i++) {
        for (int j = 0; j < nString.length(); j++) {
            if (mString.charAt(i) == nString.charAt(j)) {
                correctNumbers++;
            }
        }
    }

感謝您抽出寶貴時間閱讀! 如果你不給我一個直接的答案並指出我正確的方向,那么我可以更好地學習。 再次感謝!

(除了可能聲明一個數組並將所有重復的數字放在那里,只有在沒有數字匹配的情況下才增加它,但這樣效率非常低)

這種方法很好,可以通過使用整數的HashSet來提高效率。 每當你遇到一個共同的數字時,你在集合上做一個contains來檢查該數字(在HashSets中獲取的是恆定時間復雜 - O(1),即超快),如果它已經存在,你跳過它。 如果沒有, addadd到集合中,並遞增您的correctNumbers

我相信這會有所幫助

int found=0; for (int i = 0; i < mString.length(); i++) {
        for (int j = 0; j < nString.length(); j++) {
            if (mString.charAt(i) == nString.charAt(j)) {
                if(found==0){
                    correctNumbers++;
                }
            }
        }
}

你可以嘗試制作另一個1D陣列

 int size =  nstring.length() * mstring.length();
 bool[] array = new bool[size];`

然后讓它存儲一個布爾標志,表明該單元格之前是否已更新過。

你會發現使用單元格的唯一索引

 bool flag = false
 flag = array[(i % mString.length()) + j)];
 if(flag == true){
   <don't increment>
 }else{
    <increment>
  array[(i % mString.length()) + j)] = true;
 }

你也可以使用一個基本上可以作為你現有表的鏡像的二維數組來做到這一點:

 bool[][] array = new bool[mstring.length()][nString.length()];

你的問題很不清楚。 我想989999將返回1 因為你只處理數字,所以解決方案是:

  1. 創建一個包含9個元素的布爾數組,從0到9,命名為isChecked
  2. false初始化它。
  3. 每當你找到一個匹配的數字,比如說9時,將布爾元素轉為true ,這樣就不再計算它了( isChecked[9] = true )。

這是代碼:

var isChecked = [];

function resetArray(input) {
    for (var i = 0; i < 10; i++) {
        input[i + ''] = false;
    }
}

resetArray(isChecked);

var firstNumber = '989',
    secondNumber = '999',
    correctNumbers = 0,
    fNum, sNum;

for (var i = 0; i < firstNumber.length; i++) {
    fNum = firstNumber.charAt(i);

    // Skip already checked numbers
    if (isChecked[fNum]) {
        continue;
    }

    for (var j = 0; j < secondNumber.length; j++) {
        sNum = secondNumber.charAt(j);
        if (fNum == sNum && !isChecked[sNum]) {
            correctNumbers++;
            isChecked[sNum] = true;
        }
    }
}

console.log(correctNumbers);

JSFiddle上測試

如果您發現任何不清楚的地方,請隨時問我:)

為什么不使用新的流api? 然后就是這樣:

Arrays.stream(mString).flatMapToInt(s -> s.chars()).distinct().count();

我會解釋一下:

  • Arrays.stream(mString) - >創建所有字符串的流。
  • flatMapToInt - >從許多IntStream創建單個連接流
  • s -> s.chars() - >上面用於創建字符流(作為整數)
  • distinct - >刪除所有重復項,因此每個字符只計算一次
  • count - >計算(唯一)字符

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM