题目: 有n 个人围城一圈每次从1数起数到3就把那个人提出圈子,继续从下个人开始报数,最后只保留一个人。
package com.duapp.itfanr;
import java.util.ArrayList;
import java.util.List;
public class CharDemo {
public static void main(String args[]) {
String str = "9718532";
strout(str, 3);
}
static void strout(String str, int num) {
List<String> list = new ArrayList<String>();
for (int i = 0; i < str.length(); i++) {
list.add(String.valueOf(str.charAt(i)));
}
// 以下为关键代码
int circleCount = 0;
while (list.size() > 1) {
for (int i = 0; i < list.size(); i++) {
circleCount++;
if (circleCount == 3) {
System.out.println(list.get(i));
list.remove(i);
circleCount = 0;
i--; // 这很重要,因为你remove掉了一个,所有后面的数据的都向前移了以为相应的index 也减了1。
// System.out.println(list);
}
}
}
System.out.println(list.get(0));
}
}
或者称为猴子选大王问题: m只猴子围坐成一个圈,按顺时针方向从1到m编号。然后从1号猴子开始沿顺时针方向从1开始报数,报到n的猴子出局,再从刚出局猴子的下一个位置重新开始报数,如此重复,直至剩下一个猴子,它就是大王。设计并编写程序,实现如下功能: (1)要求由用户输入开始时的猴子数m、报数的最后一个数n。 (2)给出当选猴王的初始编号。
#!/usr/bin/python
# coding=utf-8
# 约瑟夫环算法 之 猴子选王 问题
def king(m,n):
dd = {}
#生成一个字典
p = 1
while(p<=m):
dd[p] = p
p = p+1
j = 1
while(len(dd) >1):
for k,v in dd.items():
if(j == n):
del dd[k]
j = 1
else:
j = j+1
return dd
print king(6,2)
留着以后看吧。我都没看懂。。。 参考: [1].
http://blog.youkuaiyun.com/clam_clam/article/details/6786918 [2].
http://www.pythontab.com/html/2013/pythonhexinbiancheng_0625/461.html