繁体   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