剑指offerの 21--42之JavaScript实现

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]
}
宝剑锋从磨砺出,梅花香自苦寒来。
原文地址:https://www.cnblogs.com/haimengqingyuan/p/6927201.html