阿里面试题及答案

203 阅读2分钟

问题一: 有四个骰子A B C D,它们六个面的数字分别是 A. 0 0 4 4 4 4 B.3 3 3 3 3 3 C.6 6 2 2 2 2 D.1 1 1 5 5 5 此时你要和一个对手分别选一个骰子进行投掷,掷出点数大的人获胜。如果你想让自己获胜的可能性最大,你会给自己选哪个骰子,给对手选哪个骰子?请写明具体方法

 /*
    * a 是我选的骰子
    * b 是为对方选的骰子
    * a,b均为数组传参
    * 首先计算出a中每一项比b中的几项大,生成一个新的数组
    * 把新数组按相同的项拆分为多个数组
    * */
    function  chance(a,b){
        var ary=[],len=a.length,probability=0;
        a.forEach(function(value){
            var largerNum=0;
            b.forEach(function(v){
                if(value>v){
                    largerNum++;
                }

            });
            ary.push(largerNum);
        });
        function group(arr){
            var itemAry=arr.splice(0,1);
            arr.forEach((val,i)=>{
                if(val===itemAry[0]){
                    itemAry.push(val);
                }
            });
            arr.splice(0,itemAry.length-1);
            probability+=itemAry.length/len*itemAry[0]/len;
            if(arr.length){
                group(arr);
            }
        }
        group(ary);
        return probability;
    }
    function fun(array){
        var maxProbability=0, project=[];
        array.forEach(function(item,index){
            array.forEach(function(val,i){
                if(i!==index){
                    var probability=chance(item,val);
                    if(probability>maxProbability){
                        maxProbability=probability;
                        project.push(item,val)
                    }
                }
            })
        })
        return {project:project,maxProbability:maxProbability}
    }
    console.log(fun([[6, 6, 2, 2 ,2, 2],[1, 1, 1, 5, 5, 5],[0, 0, 4, 4, 4, 4],[3, 3, 3, 3, 3 ,3 ]]));
答案是我选662222,给对方选111555,赢的概率是0.6666666

问题二: 有一个数组 list,结构如下: [{ "id": 123, "category": "USA", "name": "xiaohong" }, { "id": 12, "category": "UK", "name": "xiaoming" }, { "id": 45, "category": "CHINA", "name": "jingjing" }, { "id": 23, "category": "USA", "name": "xiaoliu" }, { "id": 78, "category": "USA", "name": "meili" }, { "id": 1, "category": "CHINA", "name": "lvluo" }, { "id": 45, "category": "USA", "name": "xiaopeng" }, { "id": 78, "category": "CHINA", "name": "maomao" }, { "id": 34, "category": "USA", "name": "huhu" }, { "id": 12, "category": "FRANCE", "name": "jiaojiao" }, { "id": 38, "category": "USA", "name": "ming" }, { "id": 22, "category": "USA", "name": "zhonghua" }] 请用原生js,把如上数组先按 category 分类,再把每个分类里的数组按照name 进行升序排序。 (说明:如果不使用原生js中 Array.sort()方法,可以加分)

function mySort(ary) {
        let sortObj={};
        ary.forEach(function (item) {
            !sortObj[item.category]&&(sortObj[item.category]=[]);
            sortObj[item.category].push(item)
        });
        for(var key in sortObj) {
            var value=sortObj[key];
            for(var i=0;i<value.length-1;i++){
                for(var j=0;j<value.length-i-1;j++){
                    if(value[j].name.localeCompare(value[j+1].name)===1){
                        var temp=value[j];
                        value[j]=value[j+1];
                        value[j+1]=temp;
                    }
                }
            }
            sortObj[key]=value;
        }
        return sortObj;
    }

欢迎大家提供更好的答案