水下功夫做透,水上才能顺风顺水。

找数组中重复的数

任何数组中找重复的数:

1.都可以通过快速排序(或者过程中就判断是否重复)后,再遍历一遍的计数的方式找到所有。时间复杂度是O(n*log(n));空间复杂度是O(1);

2.都可以通过借助map查询一遍值作为key,出现次数作为value计数,再遍历一遍计数结果的方式实现。时间复杂度是O(n),但是需要额外的空间复杂度O(n);

一.给定范围的数值重复找出

(1)1-n放在有n+1个元素的数组中,只有唯一的一个元素值重复,其它均只出现一次。求重复的数。

1. sum(arr,n+1) - (1+2+3+..+n)

2.^arr^(1^2^3^...^n)  /*利用a^a=0,0^a=a*/

(2)在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。

思路是这样的:
如果是不重复的数组,那么,使之有序之后下标和数是一样的。那么利用这个性质,把数和下标不同的数换到对应位置!当交换的两个数相同的时候,说明有重复数字,记录并返回!

eg:初始状态: {2,3,6,1,5,2,3}

一次交换后: {6,3,2,1,5,2,3}

两次交换后: {3,3,2,1,5,2,6}  

三次交换后: {1,3,2,3,5,2,6}        

四次交换后: {3,1,2,3,5,2,6}     

五次交换后: {3,1,2,3,5,2,6}       重复了!

 二.无给定范围的数值重复找出

(1)给定一个数组,里面只有一个数出现了1次,其他都出现了2次,怎么得到这个出现了1次的数。

  数组数值异或结果即为所求。

(2)

 

posted @ 2020-03-17 08:46  北方寒士  阅读(993)  评论(0编辑  收藏  举报