1、快慢指针的方法
定义两个指针,一个每次向前两步,一个每次向前一步,如果数组里有重复的数字,这两个指针一定会相遇,相遇后,快的指针重置到数组起点,两个指针在同时按步数为1的方法前进,再次相遇的数字即为重复数字
找到重复的数字(龟兔赛跑算法)_一个不可变的数组,里面有n+1个数,是从1到n,有一个数重复了,写一段代码找到这个数-CSDN博客
2、原地映射的方法
思路类似力扣中寻找丢失的数
步骤:
1、一次遍历数组中的每个元素,将元素的值取绝对值
2、判断元素值-1对应的索引位置值是否为负数,如果是负数则找到了重复元素X
3、如果不是,将元素值-1对应的索引位置值是修改为负数
以:[4,2,2,3,1]为例
[4,2,2,3,1]->[4,2,2,3,-1]->[4,-2,2,3,-1]->[4,-2,2,3,-1],遍历到第二个2的时候,2-1对应的索引位置的元素值已经是负数,说明2已经出现了重复。
3、特殊方法
1、等差数列求和公式求出1-n+1个数的总和,记为A
2、求出数组的总和,记为B
3、将A-B得到C
4、将N+1-C得到要求的X