找出数组中重复次数最少的数
昨天一道面试题,因为太紧张加上自己对Javascript的基本操作不够熟练(平时太依赖用的时候再去查),导致最后有思路,但却无从下手。
当时的思路就是根据key-value键值对来对数组进行操作。以元素来当Key,重复次数作为value。
先定义最小值为正无穷。
然后新生成一个数组temp,用来保存键值对。
循环数组arr,对每个元素进行操作之前先将元素转为String类型
最后,得到的数组temp,下标就是其在原来数组arr中的元素,值就是重复次数。
对数组temp循环,找出值最小的即可。
代码如下:
- var arr=[1,1,2,3,2,3,1,4,2,5,4,1,2,3,4,4,3,5,5];
- function search1(arr)
- {
- var min=Number.POSITIVE_INFINITY;
- var temp=new Array();
- for(i=0;i<arr.length;i++ )
- {
- var t=String(arr[i]);
- if(temp[t])
- temp[t]++;
- else
- temp[t]=1;
- }
- var min=temp[1];
- var min_t;
- for(n=1;n<temp.length;n++)
- {
- if(min>temp[n])
- {
- min_t=n;
- }
- }
- return min_t;
- }
- alert(search1(arr));
还有另外一种方法,就是先用sort函数将数据进行排列,之后生成一组有序数组。
- arr=[1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5]
然后对此数组进行统计,首先标记当前值nth和次数最少的值target为arr[0],设置最小次数为正无穷Number.POSITIVE_INFINITY;
进行循环:
当nth!=arr[i]时候,判断统计次数time和min的大小,若time小,设置min=time,target=arr[i-1];
因为当前指向的是下一个另外的元素,我们目前得到的是之前的元素次数,所以i-1;
并对time置1;
否则对time自增,进行统计。
最后返回target。
代码如下:
- // JavaScript Document
- var arr=[1,1,2,3,3,2,4,4,30,5,5,20,8,9,9,10,11,10,11,19,8,20,19];
- //sort后的结果:1,1,2,2,3,3,4,4,5,5,8,8,9,9,10,10,11,11,19,19,20,20,30
- function search2(arr)
- {
- arr.sort(function(a,b){return a-b});//排序
- var min=Number.POSITIVE_INFINITY; //定义无穷大为最小值
- var time=1;
- var nth=arr[0];
- var target=arr[0];
- for(i=0;i<arr.length+1;i++)
- {
- if(nth!=arr[i])//判断此数是否统计结束
- {
- nth=arr[i];
- if(time<min)
- {
- min=time;
- target=arr[i-1];
- }
- time=1;
- }
- else
- {
- time++;
- }
- }
- return target;
- }
- alert(search2(arr));