数组中反复的数字
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范畴内。数组中某些数字是反复的,但不晓得有几个数字反复了,也不晓得每个数字反复了几次。请找出数组中任意一个反复的数字。
看到题目中找到反复数字就要想到set汇合不容许有反复元素!!从而利用hashset进行算法计算。hashset底层数据结构是哈希表
Set汇合相似于一个罐子,程序能够顺次把多个对象“丢进”Set汇合,而Set汇合通常不能记住元素的增加程序。实际上Set就是Collection只是行为略有不同(Set不容许蕴含反复元素)。
Set汇合不容许蕴含雷同的元素,如果试图把两个雷同元素退出同一个Set汇合中,则增加操作失败,add()办法返回false,且新元素不会被退出。
题解
创立一个整数型hashset汇合
contains 判断汇合中是否有这个元素
如果有这个元素 返回true 则将这个元素作为返回值返回,
如果没有这个元素,则将这个元素加到汇合中,再对下一元素进行判断
或者用add add不进去就阐明反复了,add反复元素返回值是false!
就是遍历数组中元素,如果是新元素就加到set汇合,不是就返回,就达到目标了,因为set汇合不能add反复元素。
办法二:原地替换 巧解
在一个长度为 n 的数组 nums 里的所有数字都在 0 ~ n-1 的范畴内,数字有反复的,
如果没有反复数字,那么失常排序后,数字i应该在下标为i的地位,所以思路是重头扫描数组,遇到下标为i的数字如果不是i的话,(假如为m),那么咱们就拿与下标m的数字替换。在替换过程中,如果有反复的数字产生,那么终止返回ture,没有反复就是012345-012345
首先遍历数组,判断以后索引号对应的值是不是和索引号绝对应,
如果对应则间接进行下一次循环
如果不对应判断以后索引号对应的值和索引号对应的值的索引号对应的值是否雷同,如果雷同则阐明呈现反复元素,返回,如果不同则进行原地替换,再判断以后索引号对应的值是不是和索引号绝对应,如果不是持续下面的流程,如果对应则进入下一次循环。相当于把前面的元素顺次替换来,把最重要的替换到以后索引地位)
23012->03212->01232->01232->01232->发现反复的2.因为nums[4] = 2,nums[nums[4]]= 2,发现反复的就返回,因为后面曾经依照顺序排列好了!