如何找到数组元素的第一个实例

4
我是一名普通的程序员,正在编写一个类似“大师思维”风格的猜谜游戏程序。
现在我卡住了,我想遍历一个数组,在遇到特定数字时增加指针。
这很容易,但我想要只有在第一次遇到该数字时才增加计数器。例如,如果有两个数字(189, 999),我希望计数器只增加一次,而不是三次,这是我的代码所做的。我知道为什么会这样,但我真的找不到不这样做的方法(除了可能声明一个数组,将所有重复的数字放在那里,只有在没有数字匹配时才递增它,但这非常低效) 这是我的代码:
for (int i = 0; i < mString.length(); i++) {
        for (int j = 0; j < nString.length(); j++) {
            if (mString.charAt(i) == nString.charAt(j)) {
                correctNumbers++;
            }
        }
    }

感谢您抽出时间来阅读!我希望您可以给我指明正确的方向,而不是直接回答我的问题,这样我会更好地学习。再次感谢!

2
你的问题并不十分清晰。您是想找出两个给定数字共有多少个公共数字吗? - Siddhartha
1
如果你有(989, 999),结果会是2吗? - mkobit
不完全正确,因为有两个数字错误,应该是1而不是3。 - Ahmad Shah
5个回答

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

1
您可以尝试创建另一个一维数组。
 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()];

1
你的问题不太清楚。我认为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上进行了测试。

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


非常感谢!这里很清楚,但我在那里做了一些调整。我不太明白带有(isChecked [])和continue的if语句是什么意思? - Ahmad Shah
1
例如,989999。当已经检查并计数989中的第一个9时,您不想浪费时间再去检查第二个9,对吧?所以,直接跳过它 :) - Triet Doan

1
为什么不直接使用新的流API?那么就只需要这样做:
Arrays.stream(mString).flatMapToInt(s -> s.chars()).distinct().count();

我来解释一下:
  • Arrays.stream(mString) -> 创建所有字符串的流。
  • flatMapToInt -> 从多个IntStreams创建单个连接的流。
  • s -> s.chars() -> 用于创建字符流(作为整数)。
  • distinct -> 移除所有重复项,使每个字符仅计算一次。
  • count -> 计算(唯一)字符的数量。

1
这种方法很好,可以使用整数的HashSet使其效率更高。每次遇到一个重复数字时,您可以在集合上执行contains以检查该数字是否存在(获取HashSet的时间复杂度为常量级-O(1),即非常快),如果它已经存在,则跳过。如果不存在,则将其添加到集合中,并增加您的correctNumbers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接