我們首先來看一下約瑟夫環問題:
給定m個人,m個人圍成一圈,在給定一個數n,從m個人中的第一個人每第n個人便將其除去,求被最后一個出去的人的編號。
思路:
建立一個長度為m+1的數組,將其的內容初始化為0至m

我們設置變量i與j,i代表數組元素的下表,因為我設置的數組長度為m+1,所以數組下標就為每個人的編號,當i==m的時候,我們將i置為0,讓其從頭開始便利。
變量j為判斷當前元素是否為排列的第n個元素,如果是則將當前下標為i的元素的值置為0,不是的話,i++,j++,每當我們遍歷到數值為0的元素時,continue,i++,不進行其他操作。
具體代碼如下:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int m=scanner.nextInt(); //讀取m的值
int n = scanner.nextInt(); //讀取n的值
int[] a = new int[m+1]; //設置一個長度為m+1的數組
for(int i=0;i<=m;i++) { //初始化數組,將數組的值與其下標一一對應,易懂方便操作
a[i]=i;
}
/*
* 設置變量i與j
* i為判斷下標即為元素值
* j為判斷n的元素,如果==n即將當前i的元素除去
*/
int i=0,j=1;
boolean flag=false;//設置一個標志變量,在循環中用於break以及continue
while(true) {
i++; //一輪循環進行一次下表后移
flag=false; //將標志變量設置為false
if(a[i]==0) { //如果當前下標中的值為0,即跳過
flag=true;
if(i==m) //判斷此時的i是否==m,若果等於m則讓其重置為0
i=0;
}
if(flag) //對應上面的函數
continue;
if(j==n) { //如果j==n了
if(PanDuan(a)) { //判斷此時數組中是否只有一個非零元素,如果是則當前找到的元素為最后一個元素,否則執行else
System.out.println(i);
flag=true; //因為找到了最后一個元素,則設置標志變量為true
}
else { //只滿足j==n,不滿足其為最后一個元素,則讓當前元素的內容置為0,且讓j=0,開始新的計數
a[i]=0;
j=0;
}
}
if(flag) //找到了最后一個元素,跳出循環
break;
if(i==m) //如果i==m,則讓i=0
i=0;
j++; //一輪循環,j++
}
}
static boolean PanDuan(int [] a) { //判斷給定數組中石否只有一個非零元素
int count =0;
for(int i=0;i<a.length;i++) {
if(a[i]!=0)
count++;
}
if(count==1)
return true;
return false;
}
}
此方法為數組解決,比起用集合麻煩,但是適用於還沒有學習集合api的小伙伴們。有更簡單的方法可以跟我交流哦~
