美文网首页
2019腾讯提前批笔试

2019腾讯提前批笔试

作者: 悄敲 | 来源:发表于2019-03-09 22:44 被阅读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几个数大小以及涉及的取余等地方绕进去了,思路也乱了,浪费了大量时间。
    总结:基础的数据结构与算法要扎实,一定要自己动手写出来才行。

    相关文章

      网友评论

          本文标题:2019腾讯提前批笔试

          本文链接:https://www.haomeiwen.com/subject/qyfypqtx.html