今天的提前批笔试时间是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几个数大小以及涉及的取余等地方绕进去了,思路也乱了,浪费了大量时间。
总结:基础的数据结构与算法要扎实,一定要自己动手写出来才行。
网友评论