首页 > 代码库 > js能力测试题21--42-牛客网

js能力测试题21--42-牛客网

 

22--从上往下打印出二叉树的每个节点,同层节点从左至右打印。

function PrintFromTopToBottom(root) {  //广度遍历,先进先出,利用队列实现;深度遍历,后进先出,利用栈实现    var queue = []; //新建一个空队列    queue.push(root); //将二叉树的根push进队列    var result = []; //定义一个结果数组    if (root == null) {   //如果二叉树不存在,直接返回result        return result;    }    while (queue.length) { //当队列不为空的情况下        var temp = queue.shift();  //把队列中的第一个元素删除,并返回其值        result.push(temp.val); //将队列中的第一个元素push进result        if (temp.left) {   //根节点的左子树,push进队列            queue.push(temp.left);        }        if (temp.right) {    //根节点的右子树,push进队列            queue.push(temp.right);        }    }    return result;}

 

28--数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0

function getExpend(numbers){       var mp={}    for(var index in numbers){             //遍历numbers数组      if(!mp[numbers[index]]){            //如果numbers中的值不在mp中的话,将mp[numbers[index]]置为1,                                         // 即将numbers中的value放在mp中作key使用,然后其mp中的value为对应mp中key的个数            mp[numbers[index]]=1        }else{                          //如果numbers中的值在mp中的话,将mp[numbers[index]]++,即将mp中对应key的个数加1            mp[numbers[index]]++        }    }    for(var key in mp){                //遍历mp,mp中的key为numbers中的value,mp中的value为其个数       if(mp[key]>numbers.length/2){                 return key       }    }    return 0}console.log(getExpend([1,2,3,2,2,2,5,4,2]))

 

29--输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,88个数字,则最小的4个数字是1,2,3,4

function GetLeastNumbers_Solution(input, k)  {    if(input.length < k) { 
return false;
}
input.sort(function(a,b){
return a-b;
}
); return input.slice(0,k);}

 

33--把只包含因子235的数称作丑数(Ugly Number)。例如68都是丑数,但14不是,因为它包含因子7习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。

function Ugly(numbers){  //判断丑数       while(numbers){        if(numbers%5==0){            numbers/=5        }else if(numbers%3==0){            numbers/=3        }else if(numbers%2==0){            numbers/=2        }else if(numbers==1){            return true        }else{    //这里,表明除完5、3、2后剩下的因子不为1,则表示还有其他因子存在,因此,不是丑数            return false        }    }}function getNUgly(n){    var count=1   //用来统计第几个丑数    var num = 1   //用来表示第几个丑数对应的值    while(count<=n){        if(Ugly(num++)){            count++;        }    }    return --num}console.log(getNUgly(7))

 

 34--在一个字符串(1<=字符串长度<=10000,全部由大写字母组成)中找到第一个只出现一次的字符,并返回它的位置

function FirstNotRepeatingChar(str)    {    // write code here        var mp = {}    for (var index in str) {        //遍历numbers数组        if (!mp[str[index]]) {      //如果numbers中的值不在mp中的话,将mp[numbers[index]]置为1,            // 即将numbers中的value放在mp中作key使用,然后其mp中的value为对应mp中key的个数            mp[str[index]] = 1        } else {                       //如果numbers中的值在mp中的话,将mp[numbers[index]]++,即将mp中对应key的个数加1            mp[str[index]]++        }    }    for(var index in str){        if(mp[str[index]]==1){            return index;        }    }    return -1;}

 

 37--统计一个数字在排序数组中出现的次数。

function getCount(arr,k){ var mp={};	   //定义一个mp对象    for(var index in arr){       //遍历arr,若arr中的数据不在mp中,则将其放进mp中,mp中其对应value为1        if(!mp[arr[index]]){            mp[arr[index]]=1;        }else{            mp[arr[index]]++;//遍历arr,若arr中的数据在mp中,则将其放进mp中,mp中其对应value加1,该值对应的个数        }    }    return mp[k]?mp[k]:0  //存在k返回个数,不存在则返回0}console.log(getCount([1,3,5,6,7,8,3,8,8],8));console.log(getCount([1,3,5,6,7,8,3,8,8]s,9));

 

40--一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

function searchNum(data){   var mp={};    for(var index in data){        if(!mp[data[index]]){            mp[data[index]]=1;        }else{            mp[data[index]]++        }    }    var arr=[];    for(var key in mp){ //将个数为1的元素存在一个数组中,并返回即可        if(mp[key]==1){           arr.push(key)            //console.log(key);        }    }    return arr;}console.log(searchNum([1,2,3,4,5,4,5,3,6,6]));

 

42--输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

function FindNumbersWithSum(array, sum){    var len=array.length;    var begin=0;    var end=len-1;    var s =Math.pow(2,31)    var beginmin = 0    var endmin=0    while(begin<end){     //前后一起推进,计算,大于sum,end向前,小于sum,begin向后        if(array[begin]+array[end]>sum){            end--;        }else if(array[begin]+array[end]<sum){            begin++;        }else{        //找到一对,继续遍历,看是否还存在满足条件的            if(s>array[begin]*array[end]){                s=array[begin]*array[end]                beginmin = array[begin]                endmin=array[end]            }            begin++;            end--;        }    }	if(s == Math.pow(2,31)){   //这里s值没变,即表示没有找到满足条件的,返回空        return []    }    return [beginmin,endmin]}

 

js能力测试题21--42-牛客网