找出数组中重复次数最少的数
昨天一道面试题,因为太紧张加上自己对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));
转载于:https://www.cnblogs.com/yangzec/p/3345931.html
