本帖最后由 怪人长 于 2016-3-20 22:45 编辑
- public class Demo02 {
- /**
- * 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,
- * 从1报数,到14退出。问:最后剩下的是100人中的第几个人?
- */
- public static void main(String[] args) {
- int n = 100;
- method1(n);
- method2(n);
- }
- public static void method1(int n) {
- ArrayList<Integer> arr = new ArrayList<Integer>();
- for (int i = 1; i <= n; i++) {
- arr.add(i);
- }
-
- int count = 0;
- int num = 0;
- int k = 0;
- int p = 0;
- while(arr.size()>1) {
- for (int j = 0; j < arr.size(); j++) {
- // for (ListIterator<Integer> li = arr.listIterator(); li.hasNext();) {
- // Integer j = li.next();//如果使用该条件作为for循环的条件,也无下述隐患
- count++;
- if (count == 14) {
- k++;
- System.out.println("第" + k +"次" + arr.get(j) + "退出");
- arr.remove(j);//该方法有隐患,就是该句不能再上句前,否则会出现索引越界异常;
- count = 0;
- j--; //注意:在删除元素之后,后面的元素角标都会变化,所以需要索引位移;
- }
- }
- }
-
- if (arr.size() == 1) {
- num = arr.get(0);
- System.out.println("剩下的是" + num);
- }
- }
-
-
- public static void method2(int n) {
- ArrayList<Integer> arr = new ArrayList<Integer>();
- for (int i = 1; i <= n; i++) {
- arr.add(i);
- }
-
- int count = 0;
- int num = 0;
- int k = 0;
- while(arr.size()>1) {
- ListIterator<Integer> li = arr.listIterator();
- while(li.hasNext()) {
- Integer j = li.next();
- count++;
- if (count == 14) {
- k++;
- System.out.println("第" + k +"次" + j + "退出");
- li.remove();
- count = 0;
- }
- }
- }
-
- if (arr.size() == 1) {
- num = arr.get(0);
- System.out.println("剩下的是" + num);
- }
- }
- }
复制代码
|
|