https://leetcode-cn.com/problems/find-the-duplicate-number/
快慢指针
注意题目限制


其实这道题就是有环链表怎么找到第一个入环节点…..
结论: 快指针一次走两步,慢指针一次走一步,第一次他俩相遇后,快指针回到原点,慢指针不动,接着快指针变成一次走一步,慢指针也是一次走一步,等到再次相遇时就是第一个入环节点
public int findDuplicate(int[] nums) {if (nums == null || nums.length < 2) {return -1;}int slow = nums[0];int fast = nums[nums[0]];while (slow != fast) {slow = nums[slow];fast = nums[nums[fast]];}fast = 0;while (slow != fast) {fast = nums[fast];slow = nums[slow];}return slow;}
位运算
// 法二:位运算public int findDuplicate2(int[] nums) {if (nums == null || nums.length < 2) {return -1;}int x1 = 0;for (int i = 1; i < nums.length; i++) {x1 ^= i;}for (int num : nums) {x1 ^= num;}return x1;}
