zoukankan      html  css  js  c++  java
  • 电梯算法

    某天坐电梯时被妹纸问电梯算法,于是便简单写了一个。

    大体思路:电梯信号分为外部信号和内部信号,区别为:外部信号有方向信息,内部信号没有,所以会对所有信号做一个收集。收集完成并处理后,就进行分类,分类思路:可以制定往上楼层数和往下楼层数二个目标队列,往上的一个,往下的一个,然后定时从该二个队列中取楼层数,其中还会有方向的判断,具体代码如下:

        var upDests=[],
            downDests=[],
            index=0,
            direction=0,
            current=1,
            top=20,
            bottom=-4,
            insideSignals=[],
            outsideSignals=[];
        
        function addDest(sg){
            if (typeof sg === "object") {
                if(sg.d===1 && indexOf(upDests,sg.n)===-1){
                    upDests.push(sg.n);
                    upDests.sort(function(a,b){return a>b});
                }
                
                if(sg.d===-1 && indexOf(downDests,sg.n)===-1){
                    downDests.push(sg.n);
                    downDests.sort(function(a,b){return a<b});
                }
            
            
            }else if (!isNaN(sg)) {
                if(sg>current){
                    if(indexOf(upDests,sg)===-1){
                        upDests.push(sg);
                        upDests.sort(function(a,b){return a>b});
                    }
                }else if(sg<current){
                    if(indexOf(downDests,sg)===-1){
                        downDests.push(sg);
                        downDests.sort(function(a,b){return a<b});
                    }
                }
            }
            
            if(upDests.length===1 && downDests.length === 0 && direction === 0){
                direction=1;
            }
            
            if(upDests.length===0 && downDests.length === 1 && direction === 0){
                direction=-1;
            }
        }
        
        function indexOf(arr,el){
            var i=arr.length,
                ret=-1;
                
            while(i--){
                if(arr[i]===el){

                    ret=i;

                    break;

                }

            }
            
            return ret;
        }
        
        function updateDest(dests){
            var dest;
            
            if (dests.length) {
                dest = dests[0];
                if (current === dest) {
                    dests.splice(0, 1);
                }else {
                    current += direction;
                }
            }
            
            
            
            return dests.length;
        }
        
        
        function refresh(){
            var dest,
                d;
                
            if (direction === 1) {
                updateDest(upDests);
            }else if (direction === -1) {
                updateDest(downDests);
            }
            
            
            (current===top) || (!upDests.length && downDests.length) && (direction=-1);
            (current===bottom) || (upDests.length && !downDests.length) && (direction=1);
            !upDests.length && !downDests.length && (direction=0);
            
            
            
            direction!==0 && console.log(current);
        }

     简单测试用例:

        //内部信号2楼、5楼
        addDest(2);
        addDest(5);
        
        
        //外部信号下到3楼
        setTimeout(function(){
            addDest({
                d:-1,
                n:3
            });
            
        },1500);
        
        //外部信号上到8楼
        setTimeout(function(){
            addDest({
                d:1,
                n:8
            });
            
        },2000);
        
        //内部信号1楼
        setTimeout(function(){
            addDest(1);
        },2500);
        
        setInterval(refresh,50);
  • 相关阅读:
    Python与常见加密方式
    ERROR 2002 (HY000):Can't connect to local MySQL server though socket '/var/lib/mysql/mysql.sock'(2)
    hive的分区表
    内部表和外部表的区别
    hive之SQL
    执行wc的时候提示连接被拒绝。Connection refused
    hive的简介
    hive的部署
    top命令信息
    web界面解读
  • 原文地址:https://www.cnblogs.com/Random/p/2571491.html
Copyright © 2011-2022 走看看