幼兒園45個小朋友圍成一圈。從班長開始順時針1報數,報到3出列,下一個從1開始,來回這樣報數后,最后剩下的是班長順時針方向旁邊第幾個同學?
求告訴思路,完全搞不懂。
uj5u.com熱心網友回復:
大神在哪里?uj5u.com熱心網友回復:
來人啊 解答啊!uj5u.com熱心網友回復:
第一次回圈班長右側第3個出列,能整除3的時候都是班長開頭第二次回圈班長右側的是原始的班長右側第四個人也是上一次回圈開始報1的人
第三次回圈班長右側的是原始佇列班長右側第五個人,也是第二次回圈開始報1的人
以此類推,哥們只能幫你到這了,剩下的回圈靠你了用while回圈
uj5u.com熱心網友回復:
道理明白,就是寫不好代碼。。。。
uj5u.com熱心網友回復:
這個可以用鏈表解決 和約瑟夫問題類似uj5u.com熱心網友回復:
import java.util.LinkedList;
import java.util.List;
/**
* 有M個人,其編號分別為1-M。這M個人按順序排成一個圈。
* 現在給定一個數N,從第一個人開始依次報數,數到N的人出列,
* 然后又從下一個人開始又從1開始依次報數,
* 數到N的人又出列...如此回圈,直到最后所有人出列為止。
* 輸出出列軌跡
*
*/
public class Test5 {
static //存放M
List<String> list = new LinkedList<String>();
//一圈數數完之后,臨時存放出列的人
List<String> tmp = new LinkedList<String>();
public Test5(int m) {
for (int i = 1; i <= m; i++) {
list.add(i + "");
}
}
/**
* 遞回 執行主體
* @param start
* @param n
*/
public void start(int start,int n) {
int size = list.size();
for (int i = 1; i <= size; i++) {
if ((i + start) % n == 0) {
System.out.print(list.get(i - 1) + " 出局,");
tmp.add(list.get(i - 1));
}
}
//在m中洗掉臨時佇列的人
for (String str : tmp) {
list.remove(str);
}
//清除list
tmp.clear();
System.out.println();
if(list.size()<n){
System.out.println(list);
return ;
}
//遞回
start((size + start) % n,n);
}
public static void main(String[] args) {
long t1=System.currentTimeMillis();
//M=100
Test5 tx = new Test5(45);
//n=7
tx.start(0,3);
System.out.print("花費時間:");
System.out.println(System.currentTimeMillis()-t1);
}
}
uj5u.com熱心網友回復:
網上找的,剛學習了下uj5u.com熱心網友回復:
package com.wosai.main;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* Created by qiumy on 2017/3/7.
* <p/>
* 幼兒園45個小朋友圍成一圈。從班長開始順時針1報數,報到3出列,
* 下一個從1開始,來回這樣報數后,最后剩下的是班長順時針方向旁邊第幾個同學?
*/
public class KidDemo {
public static void main(String[] args) {
List<Integer> kids = new ArrayList<Integer>();
// init
for (int i = 0; i < 45; i++) {
kids.add(i + 1);
}
// start
startCount(kids, 0);
System.out.println("last kinds " + kids.size());
System.out.println(kids);
}
/**
* @param offset 上次剩余的人數
*/
public static void startCount(List<Integer> kids, int offset) {
if (kids.size() < 3) {
return;
}
int nextOffset = (kids.size() + offset) % 3;
for (int i = kids.size() - 1; i >= 0; i--) {
if ((i + offset + 1) % 3 == 0) {
System.out.print(kids.get(i) + "出列");
kids.remove(i);
}
}
System.out.println();
startCount(kids, nextOffset);
}
}
uj5u.com熱心網友回復:
import java.util.ArrayList;
public class Test8 {
public static void main(String[] args) {
System.out.println(getNum(45));
}
public static int getNum(int num) {
//給ArrayList分配人數,從1開始,一直到45
ArrayList<Integer> list = new ArrayList<>();
for (int i = 1; i <= num; i++) {
list.add(i);
}
//設定一個計數器,從1開始,回圈實作++,只要回圈在可以一直加下去
int count = 1;
//設定回圈,回圈結束條件為list中的size為1.
for(int i = 0;list.size() != 1; i++) {
//判斷i的值等于list的長度,從新給i賦值使其回到list的原點,重新開始報數,
if(i == list.size()) {
i = 0;
}
//用計數器取3的余數,等于零把list在該索引處的數去除.此處記得把i先自減一次,因為洗掉元素以后,后面的元素都會往前進一位,
if(count % 3 == 0) {
list.remove(i--);
}
//計數器實作自加
count++;
}
return list.get(0);
}
}
又學了一種方法,共同學習.
uj5u.com熱心網友回復:
搞不明白呀!!!!!!!!!!!uj5u.com熱心網友回復:
package csdn;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class Ring {
public static ArrayList<Integer> ring(ArrayList<Integer> iList, int index) {
if (iList.size() == 1) {
return iList;
}
ArrayList<Integer> newList = new ArrayList<Integer>();
for (Integer iValue : iList) {
if (index % 3 != 0) {
newList.add(iValue);
}
if (index++ == 3)
index = 1;
}
if (newList.size() == 0) {
System.out.println("========iList=" + iList + ",start_index=" + index);
newList.add(iList.get(iList.size()-1));
}
System.out.println("newList=" + newList + ",start_index=" + index);
return ring(newList, index);
}
public static void main1(int max) {
ArrayList<Integer> initList = new ArrayList<Integer>();
for (int i = 1; i <= max; i++) {
initList.add(i);
}
int index = 1;
System.out.println("initList=" + initList + ",start_index=" + index);
ArrayList<Integer> result = ring(initList, index);
System.out.println(result);
}
public static void main(String[] args) {
int max=45;
main1(max);
}
}
uj5u.com熱心網友回復:
剛開始覺得沒啥模擬就好,再一想拿陣列當鏈表玩會很有意思,忘記把答案發出來了,截了圖,再轉了文字,尷尬??public void doIt(int num) {
int[] people = new int [num] ;
for (int i=0,j=num-1;i<num;j=i++){
people[j] = i;}
int size = num;
int point = 0;
while (size > 1) l
int last = people[point];
point = people[last] = people[people[last]];
size-- ;}
System. out. println (point);}
uj5u.com熱心網友回復:
再發一遍/**
* @author xiaobaobao
* @date 2020/4/6,21:21
* <p>
* 幼兒園45個小朋友圍成一圈。從班長開始順時針1報數,報到3出列,
* 下一個從1開始,來回這樣報數后,最后剩下的是班長順時針方向旁邊第幾個同學?
*/
public class WhMyPeople {
public static void main(String[] args) {
new WhMyPeople().doIt(5);
}
public void doIt(int num) {
int[] people = new int[num];
for (int i = 0, j = num - 1; i < num; j = i++) {
people[j] = i;
}
int size = num;
int point = 0;
while (size > 1) {
int last = people[point];
point = people[last] = people[people[last]];
size--;
}
System.out.println(point);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/97456.html
標籤:Java SE
下一篇:資料持久化
