这是网站上的确切问题。
给定一个排序数组,其中包含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;
}
答案 0 :(得分:5)
此处 2次比较意味着您只执行2次比较原始操作。
if(a > b)
可视为1比较。但
if(a > b && c < d)
被视为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];