谈论数组时两个比较的意义

时间:2017-05-21 06:21:37

标签: c++ algorithm

这是网站上的确切问题。

给定一个排序数组,其中包含10个元素,其中包含6个不同的数字,其中只有1个数字重复5次。您的任务是仅使用两个比较来查找重复的数字。

我不确定"两个比较"在这里意味着你能否详细说明一下。谢谢。

以下是我的回答此问题的代码。

using namespace std;

int FindDuplicate(vector<int>& nums)
{

int count = 1, marked = 0;

for (int i = 0; i < nums.size(); i++)
{       

    if (nums[i + 1] == nums[marked])
    {
        count++;

        if (count == 5)
            return nums[marked];
    }

    else
    {
        marked = i + 1;
        count = 1;
    }
}

return 0;
}

5 个答案:

答案 0 :(得分:5)

此处 2次比较意味着您只执行2次比较原始操作。

if(a > b)可视为1比较。但

if(a > b && c < d)被视为2次比较。

执行2次时

if(a > b)也是2次比较。

现在,因为数组已排序且只有 6个不同的元素

我们可以很容易地列出数组元素的各种可能性,并得出以下结论:

索引5 时的元素,当它等于:

索引6 的元素,在这种情况下的答案是元素在索引6

,否则

索引4的元素就是答案。

所以解决方案是:

if(array[5] == array[6])
 return array[5];
else return array[4];

答案 1 :(得分:2)

“两个比较”意味着您只能比较两次。例如,两个比较的法律解决方案是:

  • 将第一个数字与第二个数字进行比较(第一个比较)
    • 如果第一个大于第二个,则比较第一个和第三个(第二个比较)。
      • 如果第一个仍然较大,则第一个是解决方案(无比较)
      • 如果第一个不大,则第三个是解决方案(无比较)
    • 如果第一个不大于第二个,则将第二个与第四个(第二个比较)进行比较

等...

请注意,这可能是手头问题的解决方案,只是“两个比较”意味着什么的一个例子。

答案 2 :(得分:2)

比较是==<等操作。 “两次比较”意味着你的程序只允许对数组中的数字进行两次这样的事情。

如果没有这个限制,你可以循环遍历数组并将每个数字与之前的数字进行比较。这肯定会找到重复的数字,但如果副本接近数组的末尾,则可能需要进行大量的比较。将算法限制为两次比较意味着你必须想出更聪明的东西。

答案 3 :(得分:1)

两个比较意味着只有当你得到答案时,整体比较应该是两个。你编写的程序正在进行多次比较,因为对于循环的每次迭代,你做两次(一次in for,and if in if)比较,在最坏的情况下,这个循环将迭代10次,即数组的大小。

如果你在这里查看模式,只需一次比较即可轻松获得复制元素。假设六个不同的数字是1到6.现在让我们尝试让每个元素重复5次然后我们将得到

    1 repeating => 1 1 1 1 1 2 3 4 5 6
    2 repeating => 1 2 2 2 2 2 3 4 5 6
    3 repeating => 1 2 3 3 3 3 3 4 5 6
    4 repeating => 1 2 3 4 4 4 4 4 5 6
    5 repeating => 1 2 3 4 5 5 5 5 5 6
    6 repeating => 1 2 3 4 5 6 6 6 6 6

在上述情况下,如果你分析那么除了最后一种情况,nums [4](从0索引)总是重复元素。 所以你需要做的就是

if(nums[5] == nums[6])
   return nums[5];
else 
   return nums[4]

答案 4 :(得分:1)

两次比较意味着比较值的任何情况,因此您不能使用for循环。

要解决这个难题,请注意,实际上只有6种可能的数据输入并非等效:

1: 0 0 0 0 0 1 2 3 4 5
2: 0 1 1 1 1 1 2 3 4 5
3: 0 1 2 2 2 2 2 3 4 5
4: 0 1 2 3 3 3 3 3 4 5
5: 0 1 2 3 4 4 4 4 4 5
6: 0 1 2 3 4 5 5 5 5 5

现在问题是如何以最佳方式使用它?如果您比较中间的数字并且它们相等,您可以立即回答2-5的情况。 第二个比较是区分案例1和案例6。 所以问题很简单:

if (tab[4] == tab[5])
    return tab[4];
else if (tab[0] == tab[1))
    return tab[0];
else
    return tab[9];