2019腾讯提前批笔试

2019-03-09  本文已影响0人  悄敲

今天的提前批笔试时间是19:30-21:30。不过笔试的题型出乎我的意料,5道算法题,尽管我投的是前端岗。题目还是难啊,下面就说下第一题。
有n个人开圆桌会议,从第s个人起依序报数,报到m的人离开;然后从下一个人开始接着报数,还是报到m的人离开。。。直到最后所有人都离开,求这n个人的离场顺序。n,s,m均为正整数。(这开得什么会,一群人神经病啊。)
其实这个问题的背景,我以前好像见过说得是一群人被敌人包围在山洞了,他们宁死不屈,决定自杀,但谁也不愿先死,于是他们就围成一个圈,然后和上面一样报数,只不过报到的人,是赴死。
下面是我的解答代码:

  let circleMeeting=function (n,s,m) {
        let leaveOrder=[];
        let leftCount=n;
        let start=s;

        let Person=function (order,nextPerson=null,lastPerson=null) {
            this.order=order;
            this.nextPerson=nextPerson;
            this.lastPerson=lastPerson;
        }
        let persons=[];
        for(let i=1;i<=n;i++){
            let p=new Person(i);
            persons[i]=p;
        }
        for(let i=1;i<=n;i++){
            persons[i].lastPerson=persons[i-1];
            persons[i].nextPerson=persons[i+1];
        }
        persons[1].lastPerson=persons[n];
        persons[n].nextPerson=persons[1];

        let p1=persons[start];
        while(leftCount>0){
            let count=0;
            while(p1){
                count++;
                if(count==m){
                    leaveOrder.push(p1.order);
                    p1.lastPerson.nextPerson=p1.nextPerson;
                    leftCount--;
                    p1=p1.nextPerson;
                    break;
                }
                p1=p1.nextPerson;
            }
        }
        return leaveOrder;
    }

   console.log(circleMeeting(3,1,2)); //[2, 1, 3]
    console.log(circleMeeting(5,2,3)); //[4, 2, 1, 3, 5]
    console.log(circleMeeting(6,4,4)); //[1, 5, 4, 6, 2, 3]

刚开始没想到用环形链表去做,就用死方法,结果在m,s,n几个数大小以及涉及的取余等地方绕进去了,思路也乱了,浪费了大量时间。
总结:基础的数据结构与算法要扎实,一定要自己动手写出来才行。

上一篇下一篇

猜你喜欢

热点阅读