前端笔试题目练习笔记:统计数组中不同的数字出现的概率并排序

题目要求:有一个int型数组,里面有若干数字。要求统计出一共有多少种不同的数字?每种数字出现的频率?将数组按出现频率从少到多排列,频率相同则从小到大排列。**

解决方法一:

用一个数组来存储不同的数字及出现概率,逐一拿出数组中的数字和数组中的其他数字进行比较,相同则把相同的那个设为null,同时将该数字对应的出现次数加1,最后使用冒泡排序
js实现代码:

var NumberData=[1,4,5,7,8,3,1,6,4,8,4,6,9,410,12,15,12,6,20,12,5,7,8,5,2,4,1,5,6,3,10];
function CountNumberArray(){
    var result=[];
    result[0]=[];
    result[1]=[];
    var allDisNum=0;
    var index=0;
    //统计不同的数字
    for (var i = NumberData.length - 1; i >= 0; i--) {
        var temp=NumberData[i];
        if(temp){
            result[0][index]=temp;
            result[1][index]=1;
            for (var j = NumberData.length - 1; j >= 0; j--) {
                if(temp==NumberData[j]&&j!=i){
                    result[1][index]+=1;
                    NumberData[j]=null;
                }
            }
            index++;
        }

    }
    //排序
    for (var i = 0; i <result[1].length-1; i++) {
        for(var j=i+1;j<result[1].length;j++){
            var fcnt=result[1][i];
            var fnum=result[0][i];
            if(fcnt>result[1][j]|(fcnt==result[1][j]&&fnum>result[0][j])){
                result[1][i]=result[1][j];
                result[1][j]=fcnt;
                result[0][i]=result[0][j];
                result[0][j]=fnum;

            }
        }
    }
}
解决方法二:

看了JavaScript红宝书之后,一回想这个题目,发现可以有另外一种新解法,就是用对象数组,用原生的sort来排序,统计出现次数的时候把这些数字都变成对象存入数组,两个属性,key:数字值,num:出现次数,代码如下:

var testArray=[5,2,3,4,5,4,5,6,7,8,2,3,4,1,2,3,4,5,6,7,8,9];
CountNumberArray(testArray);
function CountNumberArray(value){
    var tempObjectArray=[];
    var o={};
    o.key=value[0];
    o.num=1;
    tempObjectArray.push(o);
    for(var i=1;i<value.length;i++){
        for(var j=0;j<tempObjectArray.length;j++){
            if(tempObjectArray[j]&&tempObjectArray[j].key===value[i]){
                tempObjectArray[j].num++;
                break;
            }
            if(j==tempObjectArray.length-1){
                var o=new Object();
                o.key=value[i];
                o.num=1;
                tempObjectArray.push(o);
                break;
            }
        }

    }
    function compare(object1,object2){
        if(object1.num<object2.num){
            return -1;
        }else if(object1.num>object2.num){
            return 1;
        }else{
            if(object1.key<object2.key){
                return -1;
            }else if(object1.key>object2.key){
                return 1;
            }
        }

    } 
    var result=tempObjectArray.sort(compare);
    console.log(result);
}

以上两种解法貌似还是太复杂了,但我目前也还没想到提高效率的

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值