找出数组中重复次数最少的数
昨天一道面试题,因为太紧张加上自己对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));