約瑟夫環問題學習筆記(韓順平老師版)

2021-10-10 15:01:57 字數 1676 閱讀 2567

約瑟夫問題又稱丟手絹問題,一群小孩圍成一圈,從第m個小孩開始數數,數到第n個小孩出列,剩下的小孩繼續數數,直到剩最後乙個小孩:考常知識《單向環形鍊錶》

public

class

josephu

}//建立環形單向鍊錶

class

circlesinglelinkedlist

boy curboy = null;

//輔助指標,幫助構建環形鍊錶

//使用for迴圈建立環形鍊錶

for(

int i=

1;i<=nums;i++

)else}}

//遍歷環形鍊錶

public

void

showboy()

//因為first不能動,因此我們需要乙個輔助指標

boy curboy = first;

while

(true

) curboy=curboy.

getnext()

;//curboy後移}}

//根據使用者輸入,計算出圈順序

/** *

* @param startno 表示從第幾個小孩開始數數

* @param countnum 表示數幾下

* @param nums 表示小孩總數

*/public

void

countboy

(int startno,

int countnum,

int nums)

//建立乙個輔助指標,幫助小孩出圈

boy helper = first;

while

(true

) helper = helper.

getnext()

;}//先讓first和helper移動到報數的那個小孩位置,移動k-1次

for(

int j=

0;j1;j++

)//當小孩報數,first和helper移動m-1次,然後出圈

while

(true

)for

(int j=

0;j1;j++

)//此時first指向的小孩出圈

system.out.

printf

("小孩%d出圈\n"

,first.

getno()

);//出圈

first = first.

getnext()

; helper.

setnext

(first);}

system.out.

printf

("最後留在圈的小孩%d \n"

,first.

getno()

);}}

//建立乙個boy類,表示乙個節點

class

boypublic

intgetno()

public

void

setno

(int no)

public boy getnext()

public

void

setnext

(boy next)

}

韓順平老師的學習方法

1.高效而愉快的學習 快速學習 2.先建立乙個整體的框架。然後細節 3.用什麼再學什麼 計算機知識是永遠學不完的,要在實戰中快速學習 4.先know how 再know how 並不是什麼都要知道原理,先做出來,再慢慢知道 5.軟體程式設計是一門 做中學 的學科,不是會了再做,而是做了才會 一定要動...

韓順平Linux教程學習筆記

vmtools linux世界裡,一切皆檔案。總結 linux的目錄中有且只有乙個根目錄。linux的各個目錄存放的內容是規劃好,不用亂放檔案。linux是以檔案的形式管理我們的裝置,因此linux系統,一切皆為檔案。linux的各個檔案目錄下存放什麼內容,必須有乙個認識。快捷鍵使用練習 使用者,組...

演算法學習之約瑟夫環問題

問題 假設下標從0開始,0,1,2 m 1共m個人,從1開始報數,報到k則此人從環出退出,問最後剩下的乙個人的編號是多少?我的理解 設f m,k,i 為m個人的環,報數為k,第i個人出環的編號,m個人的環第i個出來的人就相當於m 1個人的環第i 1個出來的人,不過這個序號是相當於原來m個人的序號。但...