今天打算写代理模式的,但是发现了一个很好玩的游戏,就先写这个吧,题目如下:
有1000名罪犯,分别标上1到1000的号,第一次杀掉偶数号的罪犯,剩下的不打乱重新排号,再杀掉奇数号,再重新排号,杀掉偶数号的,如此循环,请问剩下的那个是第一次排多少号的?
这个用数学公式还是很容易算出来的,但是作为屌丝的程序员,再用数学公式去算是不是太不屌丝了。所以我决定用代码实现,代码实现如下:
public class Demo {
private static final int LENGTH = 1000;
private static int[] si = new int[LENGTH];
private static boolean flag = true;
public static void main(String[] args) {
Demo demo = new Demo();
demo.initD();
while (si.length > 1) {
demo.getD(si);
}
if (si.length > 0) {
System.out.println(si[0]);
}
}
private void getD(int[] s) {
si = kill(s, flag);
flag = !flag;
}
private void initD() {
for (int i = 0; i < si.length; i++) {
si[i] = i + 1;
}
}
private int[] kill(int[] s, boolean f) {
int m = s.length % 2 == 0 ? s.length / 2 : s.length / 2 + 1;
int[] s0 = new int[m];
int[] s1;
if (f) {
killEven(s, s0);
} else {
killOdd(s, s0);
}
if (s0[s0.length - 1] == 0) {
s1 = new int[s0.length - 1];
for (int i = 0; i < s1.length; i++) {
s1[i] = s0[i];
}
return s1;
}
return s0;
}
private void killEven(int[] s, int[] s0) {
int k = 0;
for (int i = 1; i <= s.length; i++) {
if (i % 2 != 0) {
if (k < s0.length) {
s0[k] = s[i - 1];
k++;
}
}
}
}
private static void killOdd(int[] s, int[] s0) {
int k = 0;
for (int i = 1; i <= s.length; i++) {
if (i % 2 == 0) {
if (k < s0.length) {
s0[k] = s[i - 1];
k++;
}
}
}
}
}
实现的方法有万万中,我只取了其中的一种,还可以用map实现,那样更简单一些。最后结束,希望大家多多批评指正哦