A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 emos-c 于 2013-7-2 14:13 编辑

毕老师在讲进制转换的练习后还有一个幸运儿的练习。视频里没有讲,但是我后来看到老师的讲课源码里有写,自己没搞明白,想问下这道题的需求和原理分析是什么?把需求告诉我也行,我配合代码看看,只看代码我看不懂。
  1. class LuckNumber
  2. {
  3. public static void main(String[] args)
  4. {
  5. int[] arr = {1,2,3,4,5,6,7,8};

  6. int pos = -1;

  7. for(int x=0;x<arr.length-1; x++)
  8. {
  9. for(int y=0; y<3;y++)
  10. {
  11. pos++;

  12. if(pos==arr.length)
  13. pos=0;
  14. while(arr[pos]==0)
  15. {
  16. pos++;
  17. if(pos==arr.length)
  18. pos=0;
  19. }
  20. }
  21. arr[pos] = 0;
  22. //System.out.println(arr[pos]);
  23. }

  24. for(int x=0; x<arr.length; x++)
  25. {
  26. if(arr[x]!=0)
  27. {
  28. System.out.println(arr[x]);
  29. break;
  30. }
  31. }
  32. }
  33. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 神马都是浮云

查看全部评分

5 个回复

倒序浏览
本帖最后由 longlangcx 于 2013-7-2 11:49 编辑

一句注释都没,看着真心蛋疼。

这个的题目需求似乎是这样的:
有8个数1,2,3,4,5,6,7,8围成一个圈,从1开始往后数,每数三个就把这个数踢出这个圈,然后继续数,直到剩下最后一个为止,有点类似于一个首尾相接的链表。

变量pos是用于存放当前数到的数的下标。第一个for嵌套的内层是用来数1,2,3,1,2,3这样数的,每数到3,就把这个对应的数标示为0。外侧循环设置为数组个数减1次,是因为数1次123就少一个数,一共8个,数7次123就只剩下最后一个数是幸存者了,所以这个数才叫lucknumber吧。数到数组结尾即pos = arr.length时,就让pos重新指向数组开始 pos = 0,当123123的3点到已经为0的数时就跳过不算。这样进行下去直到数组中只剩一个不为0的数时,结束上面的for嵌套。

然后后面的for循环就直接一个遍历,打印出不为零的数就欧了。

顺带一提,这个实现方式数的次数有点多,因为依然会点到已经为0的数,效率不高。其实考虑可以用一个类似链表的形式来实现,可以将其封装成对象,里面存储着前一个和后一个的信息,然后剔除一个数时就把这个数前一个数的尾信息记录为这个数后一个数,把这个数后一个数的头信息记录为前一个数,这个数就自然被跳过了。

不知道我表达清楚了没{:soso_e113:}

评分

参与人数 1技术分 +1 收起 理由
神之梦 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  1. class LuckNumber
  2. {
  3.          /*
  4.          幸运数字
  5.         思路:数组有8个数,选择其中一个为幸运数字,比如有8个小朋友,每3个小朋友为一组,每到第三个小朋友
  6.         就赋值arr[x]=0,外循环7次后,就剩下一个小朋友没有赋值,这个小朋友便是幸运数字了。
  7.         */
  8.          public static void main(String[] args)
  9.          {
  10.                  int[] arr = {1,2,3,4,5,6,7,8};

  11.                  int pos = -1;

  12.                  for(int x=0;x<arr.length-1; x++)//外循环,对数组进行遍历
  13.                 {
  14.                          for(int y=0; y<4;y++)//内循环,循环次数不是固定的,自己可以规定
  15.                         {
  16.                                  pos++;
  17.                                  System.out.println("pos="+pos);
  18.                                  if(pos==arr.length)//循环到最后一个时,从0开始继续循环。
  19.                                         pos=0;
  20.                         
  21.                                  while(arr[pos]==0)//小朋友arr[x]=0,重复赋值,需跳过这个小朋友,继续下一个。
  22.                                 {
  23.                                          pos++;
  24.                                          System.out.println("pos1="+pos);
  25.                                          if(pos==arr.length)
  26.                                                  pos=0;
  27.                                  }
  28.                         
  29.                          }
  30.                          arr[pos] = 0;//被赋值的小朋友
  31.                         System.out.println("x="+x+"..."+"arr["+pos+"]="+arr[pos]);
  32.                  }

  33.                  for(int x=0; x<arr.length; x++)
  34.                  {
  35.                          if(arr[x]!=0)
  36.                          {
  37.                                  System.out.println("arr["+x+"]="+arr[x]);
  38.                                  break;
  39.                          }
  40.                  }
  41.          }
  42. }

  43. 这是以前一哥们给我的回答,楼主可以看下
复制代码

评分

参与人数 1技术分 +1 收起 理由
Just_Only + 1 很给力!

查看全部评分

回复 使用道具 举报
支持了。。。
回复 使用道具 举报

谢谢了,你的代码为什么添加后那么整齐呢?我本来很整齐的代码一添加就成上面那样了。添加代码后还要手动再排版吗?
回复 使用道具 举报
emos-c 发表于 2013-7-2 14:15
谢谢了,你的代码为什么添加后那么整齐呢?我本来很整齐的代码一添加就成上面那样了。添加代码后还要手动 ...

代码在添加的时候,有可能会因为代码中包含一些不可见的字符,造成不整齐。
这时可以在发帖时,右上角有个纯文本,勾选一下,有时候可以解决,有时候不能。
如果可以解决,把勾去掉,继续编辑。
不能的话就只能手动排了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马