美文网首页
剑指Offer第二版 面试题3 数组中重复的数字

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

作者: 冰枫澈 | 来源:发表于2018-04-02 22:31 被阅读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个,则说明重复的值一定在这个范围内,缩小范围重复操作继续查找,直到找到最终重复的值。

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/vxlfhftx.html