概念
鸽笼原理 (抽屉原理) “如果有五个鸽子笼,养鸽人养了6只鸽子,那么当鸽子飞回笼中后,至少有一个笼子中装有2只或2只以上鸽子。”这个简单的事实就是著名的鸽笼原理,在我们国家更多地称为抽屉原理。
问题分析:看到这道题,常规做法就是创建一个的哈希数组来存储1~n的数,然后遍历查重找到缺少的数字。
下面介绍一个很巧妙的解法,也能帮助你更好的理解鸽箱原理。
数组里面数的范围是1~n,那么对应的索引范围就是0~n-1。
我们以示例一解释 [4,3,2,7,8,2,3,1]
解题思路:我们可以利用索引和n的关系,第一个数字是4,我们就将数组的第四个同时也是下标为3的数据改成负数,遍历过程中如果遇到重复的元素,我们可以用abs()方法来保证一直为负数,最后剩下为正数的下标+1就是我们要找的数组。
[4,3,2,7,8,2,3,1] 初始数据
[4,3,2,-7,8,2,3,1] 第一个数据 4 出现,将下标 3 的数据改为负数。
[4,3,-2,-7,8,2,3,1] 第二个数据 3 出现,将下标 2 的数据改为负数。
[4,-3,-2,-7,8,2,3,1]
[4,-3,-2,-7,8,2,-3,1]
[4,-3,-2,-7,8,2,-3,-1]
[4,-3,-2,-7,8,2,-3,-1]
[4,-3,-2,-7,8,2,-3,-1]
[-4,-3,-2,-7,8,2,-3,-1]
遍历完毕&#