關於約瑟夫環的問題,可能不少人都比較清楚。面試
但我頭一次據說是在一個面試的時候,當時徹底懵逼呀。算法
自己算法這塊就是很薄弱的。結果可想而知,想了好久都沒有想通。數組
如今抽空整理一下對應這個算法的理解。spa
題目我就不累述了。code
把本身的思想記下來blog
若是咱們把這個問題簡單了看,就是在一個數組裏經過下標刪除元素。rem
那麼你會說,明明是一個環型,不錯,可是咱們要把這個問題抽象一下。get
經過不斷的移動下標刪除元素,其實就是和環形的去刪除一個意思。class
1.首先,你要知道求餘這個東西。List
示例:3%5=3 19%8=3
經過第二個19%8的例子就能夠知道。
19=8*2+3
通俗的就是,在一個19人的隊伍了,從1開始報數,到隊尾以後從隊首接着數。19個數會數到幾呢?
第三遍報數到第三我的的時候結束了。
因此由這個例子反向推約瑟夫環的問題,就沒有那麼抽象了。
假定有10我的,分別是[ A B C D E F G H I J ]。每次踢出數到3的人,從第一個開始
你用這個算法就能獲得每次踢出去的人的問題了。
第一個開始就是下標爲0的,踢出數3的人就是間隔是3
那麼你就能夠這麼玩。
(0+3-1)%10=2 踢出下標2的人
(2+3-1)%9=4 踢出當前剩餘人力下標爲4的人。
以此類推。
這個問題就能夠解決了。
具體代碼以下
public Yue(int number,int start,int distance){ List<String> list=new ArrayList<String>(); for(int i=0;i<number;i++){ list.add((char)('A'+i)+""); } System.out.print("約瑟夫環("+number+","+start+","+distance+"),"); System.out.println(list.toString()); int i=start; while(list.size()>1){ i=(i+distance-1)%list.size(); System.out.print("刪除的元素:"+list.remove(i).toString()+","); System.out.println(list.toString()); } System.out.println("被赦免的罪犯是:"+list.get(0).toString()); } public static void main(String[] args) { new Yue(10,1,3); }