50个人围成一圈数到3和3的倍数时出圈,问剩下的人是谁?在原来的位置是多少(简单易懂)
发布日期:2021-05-08 13:47:32 浏览次数:12 分类:精选文章

本文共 1241 字,大约阅读时间需要 4 分钟。

该题目的圈的元素个数是50个,每次数到3或3的倍数的时候,就把当前元素出圈,并且继续数数(假设删掉的是6的那个数字,那么下一个叫7而不是叫6),直到再遇到3的倍数。这里,如果下标从0开始,一直到一圈完成以后,它就会接到圈的首部,这应该如何处理呢?其实,最好的办法就是使用取余的办法,就可以始终得到3个倍数,无论它的倍数是多少,也不管它的元素个数是多少。

由于每次去掉元素以后,元素的个数会少一个,因此下一个3的倍数其实只需要走两步,在为其下标赋值的时候,需要减一,保持每次去掉的元素都是3的倍数。

说明:如果使用从0开始的下标开始计算,那么初始化的时候应该使用-1(对应后来的index--,这样就可以模拟元素已经减少一个了(令起始数字为123,初始化为-1,下一个去掉的数字就是3).如果下标为0的被删除,下标为1的还没有被删除,这时候下标为1的数字的下标自动为0。

[java] 
 
  1. public class CycleTest {  
  2.   
  3.     public static void main(String[] args) {  
  4.         // TODO Auto-generated method stub  
  5.         System.out.println("该数字原来的位置是:" + cycle(50,3));  
  6.     }  
  7.   
  8.     private static int cycle(int total, int k) {  
  9.         List<Integer> dataList = new LinkedList<Integer>();  
  10.         for (int i = 0; i < total; i++) {  
  11.             dataList.add(new Integer(i+1));  
  12.         }  
  13.         int index = -1;  
  14.         while (dataList.size()>1) {  
  15.             index = (index + k)%dataList.size();  
  16.             dataList.remove(index--);//去除该数字,index减一  
  17.             displayList(dataList);//清除后打印,观察结果  
  18.             System.out.println();  
  19.         }  
  20.         //return dataList.get(0);也可以替换下一行  
  21.         return ((Integer)dataList.get(0)).intValue();  
  22.     }  
  23.   
  24.     private static void displayList(List<Integer> dataList) {  
  25.         for (int i = 0; i < dataList.size(); i++) {  
  26.             int a = dataList.get(i);  
  27.             System.out.print(a + " ");  
  28.         }  
  29.     }  
  30.   
  31. }  


大家可以简单的测试下,比如测试5个数,当个数比较少的时候更能理解其原理。

该数字原来的位置是:11

参考文章:http://blog.csdn.net/hi_kevin/article/details/17678239

上一篇:集合框架图整理
下一篇:Spring Boot 集成 JWT

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月14日 13时03分53秒