feezh

我们之所以努力赚钱,是为了让父母为自己买东西时能像给我们买东西时一样大方!
随笔 - 7, 文章 - 0, 评论 - 10, 引用 - 0
数据加载中……

[java经典算法题]有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?
 1package com.weidu.algorithms;
 2
 3import java.util.Arrays;
 4import java.util.Scanner;
 5
 6/**
 7 * @Title:
 8 * @Description:
 9 * @author Afei
10 * @date: 日期:2012-6-10 时间:下午05:41:04
11 * @Copyright:西北师范大学纬度工作室 Copyright (c) 2012
12 * @version:1.0
13 */

14public class Qu3 {
15
16    /**
17     * 功能说明:1、 有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,<br>
18     * 问最后留下的是原来第几号的那位。
19     * 
20     * @Afei 2012-6-10
21     * @param args
22     */

23
24    public static void main(String[] args) {
25        // TODO Auto-generated method stub
26        Scanner input = new Scanner(System.in);
27        System.out.print("请输入总人数:");
28        int p = input.nextInt();
29        /**** 初始化人员 ***/
30        boolean[] per = new boolean[p];// boolean数组表示站成一圈的人,false表示退出
31        for (int i = 0; i < per.length; i++{
32            per[i] = true;
33        }

34
35        /**** 报号 ***/
36        int t = 0, len = per.length;
37        while (len > 1{
38            for (int i = 0; i < per.length; i++{
39
40                if (per[i]) {
41                    t++;
42                    if (t == 3{
43                        t = 0;
44                        per[i] = false;
45                        len--;
46                    }

47                }

48            }

49        }

50        /***** 结果 *****/
51        System.out.println("最后的情况:" + Arrays.toString(per));
52        for (int i = 0; i < per.length; i++{
53            if (per[i]) {
54                System.out.println("原来喊的数:" + (i + 1% 3);
55            }

56        }

57    }

58}

59


posted on 2012-06-12 00:08 feezh 阅读(30736) 评论(7)  编辑  收藏 所属分类: Java相关

评论

# re: [java经典算法题]有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?  回复  更多评论   

import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;


/**
* 递归算法实现,改为非递归也非常easy
* @author 李佳
*
*/
public class E
{
// 存储人员编号 1....N和报号 (1,2,3)的对应关系
private static TreeMap<Integer,Integer> tm = new TreeMap<Integer,Integer>();
// 初始化 ,假设有100人
public static void inint()
{
for(int i=1;i<=300;i++)
{
// 直接模3后会是1,2,0,将0改为3.
tm.put(i, i%3==0?3:i%3);
}
}

/**
* 算法如下:
*
* 1 移除报号为3的人
* 2 如果只剩两人,则结束
* 3 根据tm中最后一个人的报号M,重新计算每个人的报号
* 即第一个人为(M+1)%3,第二个人为(M+2)%3
* 4 重复第一步.
*
* 当然最后剩下的两人的报号肯定为1和2,若继续下去的话,就是报号为2的那个人最终剩下.这一步我没有写
*/
public static void compute()
{
// 1 移除报号为3的人
Iterator<Map.Entry<Integer , Integer>> it = tm.entrySet().iterator();
while(it.hasNext())
{
if(it.next().getValue().equals(3))
{
it.remove();
}
}
// 2 如果只剩两人,则结束
if(tm.size()<=2)
{
return;
}
// 3 根据tm中最后一个人的报号M,重新计算每个人的报号
// 即第一个人为(M+1)%3,第二个人为(M+2)%3
resort();
// 4 重复第一步.
compute();
}
public static void resort()
{
// resort
int last = tm.lastEntry().getValue();
Iterator<Map.Entry<Integer , Integer>> it = tm.entrySet().iterator();

while(it.hasNext())
{
last++;
it.next().setValue(last%3==0?3:last%3);
}
}
public static void display()
{
System.out.println(tm);
}
public static void main(String[] adfafd)
{
inint();
compute();
display();
}

}
2012-06-15 16:28 | walnutprince

# re: [java经典算法题]有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?  回复  更多评论   

@walnutprince
谢谢,学习了
2012-06-17 15:41 | afei

# re: [java经典算法题]有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?  回复  更多评论   

Valuable information ..I am delighted to read this article..thank you for giving us this useful information. Great walk-through. I value this post.!!
2012-10-30 13:30 | website design jp nagar

# re: [java经典算法题]有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?  回复  更多评论   

@walnutprince
和我的想法完全一样
2012-11-21 17:07 |

# re: [java经典算法题]有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?  回复  更多评论   

下面那个递归resort方法有问题,如果刚好去除最后一个数,剩下的最后一个数的value是2的话,本来是1的第一个数会变成3被去除;需要加一个判断在resort方法里。输入的数大于等于7就会跟上一题不同的答案
2013-05-27 01:27 | jqy

# re: [java经典算法题]有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?  回复  更多评论   

@website design jp nagar
SB
2013-10-20 16:39 | gfgrgr

# re: [java经典算法题]有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位?  回复  更多评论   

谢谢分享!
2014-04-09 22:47 | Deen

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问