如何查找元素数组

时间:2015-10-21 23:20:14

标签: java arrays

我是一个非常基本的程序员,而且我正在编写一个' Master-mind'风格猜谜游戏程序。

现在,我遇到的部分是我想要通过一个数组并在遇到特定数字时增加指针。

现在这很容易和东西,但我想要做的只是增加计数器,如果第一次遇到这个数字。所以,例如,如果有两个数字(189,999),我希望计数器只增加一次,而不是3次,这就是我的代码所做的。我知道它为什么这样做,但我无法找到一种不做的方法(除了可能会声明一个数组并将所有重复的数字放在那里而只是在没有数字匹配的情况下递增它,但是& #39;超级低效)这是我的代码:

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

感谢您花时间阅读!如果你不能给我一个直接的答案,只是指出我正确的方向,那么我可以更好地学习,我更喜欢它。再次感谢!

5 个答案:

答案 0 :(得分:1)

  

(除了可能声明一个数组并将所有重复的数字放在那里,只有在没有数字匹配的情况下才增加它,但这样效率非常低)

这种方法很好,可以通过使用HashSet整数来提高效率。每当你遇到一个共同的数字时,你在集合上做一个contains来检查那个数字(在HashSets中得到的是恒定时间复杂 - O(1),即超快),如果它出现在那里已经,你跳过它。如果没有,请将add放入集合中,然后递增correctNumbers

答案 1 :(得分:1)

我相信这会有所帮助

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++;
                }
            }
        }
}

答案 2 :(得分:1)

您可以尝试制作

的另一个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()];

答案 3 :(得分:1)

你的问题很不清楚。我想989999将返回1。因为你只处理数字,所以解决方案是:

  1. 创建一个包含9个元素的布尔数组,从0到9,名为isChecked
  2. 使用false初始化它。
  3. 每当您找到匹配的数字(例如9)时,将布尔元素转为true,以便您不再计算它(isChecked[9] = true)。
  4. 以下是代码:

    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上进行了测试。

    如果您发现任何不清楚的地方,请随时问我:)

答案 4 :(得分:1)

为什么不使用新的流api?然后就是这样:

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

我会解释:

  • Arrays.stream(mString) - &gt;创建所有字符串的流。
  • flatMapToInt - &gt;从许多IntStreams创建单个连接流
  • s -> s.chars() - &gt;上面用于创建字符流(作为整数)
  • distinct - &gt;删除所有重复项,因此每个字符只计算一次
  • count - &gt;统计(唯一)字符