• 剑指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]
    }
    
    宝剑锋从磨砺出,梅花香自苦寒来。
  • 相关阅读:
    context:component-scan报错
    goland 实用键
    React-Native 指定模拟器RUN-IOS
    mac 卸载编辑器卸不干净
    go 区分指针
    go 学习Printf
    我的命令行
    mysql8的坑
    小三角
    eslint 禁用命令
  • 原文地址:https://www.cnblogs.com/haimengqingyuan/p/6927201.html
Copyright © 2020-2023  润新知