剑指Offer第二版 面试题3 数组中重复的数字

2018-04-02  本文已影响0人  冰枫澈

剑指Offer第二版 面试题3 心得

数组中重复的数字:

题目一:找出数组中重复的数字。

在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。

先附上代码

实现函数

首先,两个条件判断:

1.数组不能为空,长度不能小于0.否则return false

2.长度为n的这个数组值范围在0~n-1,若不满足,返回false

实现思想:

重排数组,数字i将出现在下标i的位置,但因数组中有重复数字,所以肯定有不满足的时候。

首先,排序过程,遍历数组,当数组下标 i 与数组的值 m 不等时,将下标是m的数组中的值与下标i的数组的值m交换。

这个过程中,要先判断,一旦下标为i的数组的值m等于下标为m的数组的值,则表示m为重复的数字。

加入主函数

主函数

注意:

1.sizeof(data)=28,原因是data中有7个数,每个数值都是int类型,占4byte,共占7*4=28byte

sizeof(data[0])=4,一个int类型,4byte。

2.数组作为参数传递的时候,数组会自动退化为同类型的指针。

3.将一个int类型的duplication传参时,要注意加引入传递,形参声明一个指针指向,即可随时改变其值。

题目二:不修改数组找出重复的数字

在一个长度为n+1的数组里的所有数字都在1~n的范围内,所以数组中至少有一个数字是重复的,请找出任意一个重复的数字,但不能修改输入的数组。例如,如果输入长度为8的数组{2,3,5,4,3,2,6,7},那么对应的输出是重复的数字2或者3.

附上代码

解题思路:

应用二分查找思想,例如长度为8的数组,数组值的范围必定为1~7之间,将其值范围二分,1~4和5~7,查找整个数组的值在1~4范围内有几个,如果大于4个,则说明重复的值一定在这个范围内,缩小范围重复操作继续查找,直到找到最终重复的值。

上一篇下一篇

猜你喜欢

热点阅读