『壹』 java中「index=-1」是什麼意思
某些查詢方法中,如果沒有查找到你想要的結果,就會返回-1,表示沒有查找到。
『貳』 java循環單鏈表實現約瑟夫環,我的代碼出列順序不正確
你的remove方法不對,你的方法每次刪掉的是從head開始第m個位置的節點,
但約瑟夫環需要的內是容要刪掉每次循環數到m的位置的節點。
remove方法可以去掉,再把out方法改一下就可以了。
public void out(int m) throws Exception {
Node p = head;
Node pre = null;
int count = 1;
while (curlen > 0) {
if (count == m) {
System.out.print(p.getData() + " ");
if(pre != null){
pre.setNext(p.getNext());
}
p = p.getNext();
curlen = curlen - 1;
count = 1;
} else {
pre = p;
p = p.getNext();
count++;
}
}
}
『叄』 java編程17人編號為0-16圍成一圈,0號人開始從1報數,凡是報數為3倍數的人離開圈子,繼續到一個,問他編號
這是一個約瑟夫環的問題
解答如下:
依據提議,可以將題目等價變換為:「n(n=17)人編號為0到(n-1)圍成一圈,0號人開始從0報數,凡是報數為m-1 (m=3)倍數的人離開圈子,繼續到一個,問他編號」
一開始的狀態
0,1,2,3,4,5 ..... (n-2), (n-1) 【n個人】
第一個人被踢之後 設第一個被踢的人的編號為k, 則 k = m%n-1 【當n=17,m=3時,k=2。也就是說編號為2的人離開了圈子】
這時候的狀態
0, .... (k-1), (k+1) ,(k+2)...(n-2),(n-1) 【(n-1)個人,當n=17,m=3時: 0,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16】
將這時候的編號做轉換. 因為是圍城一個圈子,下一個開始數的是(k+1).所以也可以表示為
(k+1),(k+2) ... (n-2),(n-1),0....(k-1) 【(n-1)個人,當n=17,m=3時: 3,4,5,6,7,8,9,10,11,12,13,14,15,16,0,1】
重新編號。得到:
0,1,2,3,4...(n-3),(n-2)【(n-1)個人】 這個時候 ,這里重新構成了一個約瑟夫環。也就是說,這是一個遞推的關系。
這里我們進行了重新編號。那麼 (n-1)個人和 n個人之間的編號不一樣的。但是兩者之間有一定的關系,可以沖新編號推導出老的
公式如下: i' = (i+k)%(n-1) 【比如,當n=17,m=3時 . 新的環編號是 (n-2),我要求他在老的環中的編號,那麼編號是 i' = ( (n-2) + k ) % (n-1) = 17%16 = 1,就是老的換種編號為1的那一個 】
反過來有 :i = (i'+m)%n
有了上面的推斷,可以代碼如下:
int ysf(int n,int m){
if(n==1){
return 0; //當環內只有一個人的時候,就是他自己
}
return (ysf(n-1,m) + m ) % n ;
}
------------------完整代碼---------------------
public class Test{
public static void main(String[] args){
int a = 17;
int b = 3;
System.out.println(ysf(a,b));
}
static int ysf(int n,int m){
if(n==1){
return 0;
}
return (ysf(n-1,m) +m) % n;
}
}