【问题标题】:Find the lone number找到唯一的号码
【发布时间】:2020-11-12 13:41:53
【问题描述】:

我正在尝试搜索一个数组并打印出其中唯一没有一对的数字,因此在本例中为“4”。

结果一直显示为 2,所以即使我觉得我的逻辑是正确的,但我肯定忽略了一些东西。

我一直在尝试解决这个问题,但一直卡住

非常感谢。

代码如下:


int main(){
    int arr[] = {1, 1, 2, 2, 3, 3, 4};
    int n = sizeof(arr)/sizeof(*arr);
    int foundNum = 0;
    int counter = 0;

    while(counter !=n) {
        int i = 0;
        if (arr[i] != arr[i + 1]) {
            foundNum = arr[i];
        } else {
            arr[i] = arr[i+2];
        }
        counter += 1;
    }
    std::cout << foundNum;
    return 0;
}

【问题讨论】:

  • 你的逻辑在我看来完全错误。你不更新i。是否打算更新数组?看来您应该先用简单的语言(如英语)解释如何完成任务,然后编写代表您的解释的代码。
  • 如果你的目标是“搜索”,那么你想通过修改数组来达到什么目的?
  • 第一个迭代器:arr[0] == arr[1],所以arr[i] = arr[i+2] 被执行,arr[0] 被设置为2 (arr[2]) 第二个迭代器和更高版本:arr[0] != arr[1],所以foundNum = arr[i] 是已执行并将foundNum 设置为2 (arr[0])。
  • 嗨,迈克,感谢您的回复。我只想在数组中搜索一个元素与其旁边的元素进行比较,如果它们相同,则移动到下一个数字,即 I + 2 个位置,如果没有匹配,则再次执行相同操作数字,将其设置为foundNum,然后将其作为输出
  • "arr[i] = arr[i+2];"不会“移动到下一个数字”。在我看来,这里需要做什么is have the shown code reviewed by your rubber duck,然后按照你的橡皮鸭的指示。

标签: c++ arrays algorithm logic


【解决方案1】:

如果您确定除唯一数字之外的所有剩余数字都成对出现,则使用XOR 操作非常容易。

并且 xor a pair 为 0。因此,如果您遍历整个数组,则 xor 后所有对都为 0。

与 0 的 XOR 会产生相同的数字本身。因此,当所有数字都通过它们自己的副本取消时,唯一的数字 xor 与生成的 0 一起保留作为答案。

代码:

int main(){
    int arr[] = {1, 1, 2, 2, 3, 3, 4};
    int n = sizeof(arr)/sizeof(*arr), a = 0;
    for ( int i = 0; i < n; i++ ) a = a ^ arr[i];
    std::cout << "Found the lone number : " << a;
    return 0;
}

【讨论】:

  • 我不明白它是如何完全工作的,但这是一个干净的解决方案并且非常有用。一定要研究一下,谢谢。
  • @Severin12121 请阅读 XOR 操作,并通过数组进行操作,您将得到它。
【解决方案2】:

您有counter,因此您应该使用它来确定要检查的索引,而不是新变量i

同样要将搜索位置移动到+2位置,您应该将2添加到循环变量中,而不是修改数组。

#include <iostream>

int main(void){
    int arr[] = {1, 1, 2, 2, 3, 3, 4};
    int n = sizeof(arr)/sizeof(*arr);
    int foundNum = 0;
    int counter = 0;

    while(counter !=n) {
        if (counter + 1 >= n || arr[counter] != arr[counter + 1]) {
            foundNum = arr[counter];
            counter += 1;
        } else {
            counter += 2;
        }
    }
    std::cout << foundNum;
    return 0;
}

【讨论】:

  • “分段错误(核心转储)”
  • arr[counter + 1] 将在 counter == n-1 时超出数组范围
  • @NullPointer 应该被条件counter + 1 &lt; n阻止
  • 条件仍然被检查....?你不认为它会检查语句中的第一个条件,然后什么都没有……是吗?
  • 非常感谢,就像一个指针 - 这仅在从 if 条件中删除 counter + 1 &lt; n 时有效
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
相关资源
最近更新 更多