黑马程序员技术交流社区
标题: 一个很难的算法题,能独自做出来的都是大神。 [打印本页]
作者: HARRY_yFd0S 时间: 2016-9-8 21:17
标题: 一个很难的算法题,能独自做出来的都是大神。
本帖最后由 HARRY_yFd0S 于 2016-9-8 23:21 编辑
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号。
各位大神可以挑战一下。
作者: LoneRan9er 时间: 2016-9-8 22:00
很感兴趣 求大神解答一下 啊
作者: HARRY_yFd0S 时间: 2016-9-8 22:24
20行代码做出来了,好开心
作者: HARRY_yFd0S 时间: 2016-9-8 22:41
贴出我的代码,验证过几组数据,都是ok的
public static void main(String[] args) {
ArrayList<Integer> al = new ArrayList<Integer>();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入人数:");
int n = scanner.nextInt();
for (int i = 1; i <= n; i++) {
al.add(i);
}
int i = 0;
while(al.size() > 1) {
i += 2;
while(i > al.size() - 1) {
i = i - al.size();
}
al.remove(i);
}
System.out.println("最后一个人的编号是:"+al.get(0));
}
作者: 勿忘`初心 时间: 2016-9-8 23:07
好难,这是谁出的题
作者: &天马星空ぁ 时间: 2016-9-8 23:13
很厉害,看了好一会算法才看明白,膜拜
作者: 岳阳天 时间: 2016-9-8 23:14
private static int getNum(int i) {
//创建集合,存储人数
ArrayList<Integer> list = new ArrayList<Integer>();
//遍历,把每个人的代号添加到数组中
for (int j = 1; list.size()<i ; j++) {
list.add(j);
}
int count = 1;
for (int j = 0; list.size()!=1; j++) {
//如果索引是最后一个加一,那么让索引归零
if(j == list.size()){
j = 0;
}
if(count %3 ==0){
//没数到三个删除一次
list.remove(j--);
}
count ++;
}
return list.get(0);
}
作者: HARRY_yFd0S 时间: 2016-9-8 23:16
大神真厉害!
作者: yigezhifu 时间: 2016-9-8 23:39
这题不难啊
作者: IT南 时间: 2016-9-8 23:40
我操 牛逼,搞了半天没搞出来 睡觉
作者: MarsBong 时间: 2016-9-8 23:40
说下思路吧,存到list集合中,然后计算报数,使用迭代,并且迭代的过程中计数,计数到3,将刚迭代的元素移出集合,计数器归零,继续从下一个迭代,并且重复上述步骤,注意迭代的过程是循环不断的,只有满足只有一个元素时,才结束迭代,跳出循环
作者: a65912555 时间: 2016-9-8 23:46
顶顶顶~~
作者: houseofthrones 时间: 2016-9-10 00:15
这道题好难
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |