逢三退一 算法

来源:互联网 发布:蜂蜜和四叶草 知乎 编辑:程序博客网 时间:2024/06/08 09:20

 转自CSDN   http://blog.csdn.net/elifefly/article/details/3459748

方法一

  1. public class Cout3Quit
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.         boolean[] arr new boolean[500]; // 创建一个布尔型数组
  6.         int contNum 0// 数数,计算数了多少个,数到3就退1个
  7.         int index 0// 第几个位置,数到的位置
  8.         int arrlength arr.length; // 数字队列还有多少个
  9.         for (int 0arr.length; i++)
  10.         {
  11.             arr[i] true// 把数组的值得全部置为true
  12.         }
  13.         while (arrlength 1// 留下最后一个
  14.         {
  15.             if (arr[index] == true)
  16.             {
  17.                 contNum++; // 从0开始数
  18.             //    if (contNum == 2) // 从0开始的,数到2就是第三个数字了
  19.                 if (contNum == 3) //此处应该改为3,原作者理解有误
  20.                 {
  21.                     arr[index] false// 数到第三个数,把它的值变为false
  22.                     arrlength--; // 数组长度减去1
  23.                     contNum 0// 重新数数
  24.                 }
  25.             }
  26.             index++; // 每判断一个,加1
  27.             if (index == arr.length) // 判断是否到了最后的数字,到了,重新从0开始
  28.             {
  29.                 index 0;
  30.             }
  31.         }
  32.         // 打印数组中有true值的那个下标值,即最后那个是第几个
  33.         for (int 0arr.length; j++)
  34.         {
  35.             if (arr[j] == true)
  36.             {
  37.                 System.out.println(j);
  38.             }
  39.         }
  40.     }
  41. }

方法二

  1. public class Count3Quit2
  2. {
  3.     public static void main(String[] args)
  4.     {
  5.         KidCircle kc new KidCircle(500);
  6.         int num 0;
  7.         Kid kc.first;   //从第一个开始数数
  8.         while (kc.count 1)
  9.         {
  10.             num++;   //数数
  11.             if (num == 2 // 从0开始的,数到2就是第三个数字了
  12.             {
  13.                 kc.delete(k);  //删除当前的k
  14.                 num 0      //重新数数
  15.             }
  16.             k.right;  //k右孩子赋给k
  17.         }
  18.         System.out.println(kc.first.id); // 打印最后的一个孩子的id
  19.     }
  20. }
  21. class Kid
  22. {
  23.     int id 0// 孩子号码
  24.     Kid left; // 左边的孩子
  25.     Kid right; // 右边的孩子
  26. }
  27. class KidCircle
  28. {
  29.     int count 0;
  30.     Kid first;
  31.     Kid last;
  32.     // 构造函数,构造n个孩子围成的圈
  33.     public KidCircle(int n)
  34.     {
  35.         for (int 0n; i++)
  36.         {
  37.             add(); // 调用add方法,循环一次增加一个孩子
  38.         }
  39.     }
  40.     // 添加孩子
  41.     public void add()
  42.     {
  43.         Kid new Kid();
  44.         k.id count;
  45.         if (count <= 0)
  46.         {
  47.             first k; // 只有一个孩子
  48.             last k;
  49.             k.left k;
  50.             k.right k;
  51.         }
  52.         else
  53.         {
  54.             last.right k; // 从最后的节点开始,k成为last的右边孩子
  55.             k.left last; // last成为k的左边孩子
  56.             k.right first; // k成为first的右边孩子
  57.             first.left k; // k成为first的左边孩子
  58.             last k; // 这时候k变成了最后一个
  59.         }
  60.         count++;
  61.     }
  62.     // 删除孩子
  63.     public void delete(Kid k)
  64.     {
  65.         if (count <= 0// 没有孩子
  66.         {
  67.             return;
  68.         }
  69.         else if (count == 1// 只剩一个孩子
  70.         {
  71.             first last null;
  72.         }
  73.         else
  74.         {
  75.             k.left.right k.right; // k的右孩子成为 k的左孩子 的右边孩子
  76.             k.right.left k.left; // k的左孩子成为 k的右孩子 的左边孩子
  77.             if (k == first) // 如果k是第一个孩子first
  78.             {
  79.                 first k.right;
  80.             }
  81.             else if (k == last) // 如果k是第一个孩子last
  82.             {
  83.                 last k.left;
  84.             }
  85.         }
  86.         count--;
  87.     }
  88. }
0 0