题外话:找算法,在线编程在面试中占比50%。
听说上面的题外话,依旧重拾艰难困苦之心,翻开剑指offer按照题目类型以及随机抽取,还是决定开始好好的看看剑指offer的在线编程66道题。没有信心的跟我一起做下去,欢迎加入古月家族,也可以一起约定每天做那两道题,一起克服这个编程关。 当然更欢迎,高手纠正以及指导,嘿嘿。
数组中重复的数字-面试题目3
题目要求:一个数组长度为n, 数字为0到n-1的数字,判断数组中是否存在重复的数字。
1第一种,暴力法,按照最简单的思路就是对数据进行排序,然后查找重复的数字就很简单的问题的啦。
2 第二种:就是哈希表,利用索引值即位置,以及对应位置上的值是否相等去判断数组是否存在重复的数字。
先假设数组为numbers。我觉的在数组中主要的三个因素就是: 位置 i, 对应位置元素numbers[i],以及有可能鸠占鹊巢的numbers[numbers[i]].
SoSoSoSo!第一步就是判断是否每个元素是否各司其职,即 i==numbers[i].
如果上述等式不成立,则需要将这些换回到原来的位置。
因此,这就涉及到numbers[i]和numbers[numbers[i]] 两者之间的pk,判断两者是否存在争夺,也许就是没有关系。
第一步,即是判断两者是否相等,numbers[i] == numbers[numbers[i]] 。如果两者相等,将二者之一的值保留,并输出bool值 true。
第二步: 如果两者不相等,则需要将两者进行交换。swap (numbers[i] , numbers[numbers[i]).
\
答案:
class Solution {
public:
bool duplicate(int numbers[], int length, int* duplication) {
if(numbers == nullptr || length <= 0)
return false;
for(int i = 0; i < length; ++i) {while(numbers[i] != i) {if(numbers[i] == numbers[numbers[i]]) {*duplication = numbers[i];return true;}// 交换numbers[i]和numbers[numbers[i]]swap(numbers[i], numbers[numbers[i]]);}}return false;
}
};