今天的提前批筆試時(shí)間是19:30-21:30。不過(guò)筆試的題型出乎我的意料,5道算法題,盡管我投的是前端崗。題目還是難啊,下面就說(shuō)下第一題。
有n個(gè)人開(kāi)圓桌會(huì)議,從第s個(gè)人起依序報(bào)數(shù),報(bào)到m的人離開(kāi);然后從下一個(gè)人開(kāi)始接著報(bào)數(shù),還是報(bào)到m的人離開(kāi)。。。直到最后所有人都離開(kāi),求這n個(gè)人的離場(chǎng)順序。n,s,m均為正整數(shù)。(這開(kāi)得什么會(huì),一群人神經(jīng)病啊。)
其實(shí)這個(gè)問(wèn)題的背景,我以前好像見(jiàn)過(guò)說(shuō)得是一群人被敵人包圍在山洞了,他們寧死不屈,決定自殺,但誰(shuí)也不愿先死,于是他們就圍成一個(gè)圈,然后和上面一樣報(bào)數(shù),只不過(guò)報(bào)到的人,是赴死。
下面是我的解答代碼:
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]
剛開(kāi)始沒(méi)想到用環(huán)形鏈表去做,就用死方法,結(jié)果在m,s,n幾個(gè)數(shù)大小以及涉及的取余等地方繞進(jìn)去了,思路也亂了,浪費(fèi)了大量時(shí)間。
總結(jié):基礎(chǔ)的數(shù)據(jù)結(jié)構(gòu)與算法要扎實(shí),一定要自己動(dòng)手寫(xiě)出來(lái)才行。