`
conanca
  • 浏览: 99604 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

用 Java 的 TreeSet 实现约瑟夫问题

阅读更多
今天在JavaEye论坛热点推荐看了篇帖子《杰哥私房题──约瑟夫问题》

自己试着写了下,用 Java 的 TreeSet 实现的。

package com.javaeye.conanca.joseph;

import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

/**
 * @author Conanca
 *
 */
public class Joseph {

	/**
	 * 问题描述
	 * 约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号
	 * 开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1 开始报数。就这样,
	 * 直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。
	 * 输入数据
	 * 每行是用空格分开的两个整数,第一个是 n ,第二个是 m ( 0 < m, n < 300),最后一行是:0 0 
	 * 输出要求
	 * 对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号
	 * 输入样例:
	 * 6 2
	 * 12 4
	 * 8 3
	 * 0 0
	 * 输出样例:
	 * 5
	 * 1
	 * 7
	 */
	public static void main(String[] args) {

		Scanner in =new Scanner(System.in); 
		System.out.print("有几只猴子选大王?"); 
		int amount = in.nextInt();
		System.out.print("喊几的退出圈子?"); 
		int num = in.nextInt();

		// 定义"猴子圈"
		Set<Integer> monkeys = new TreeSet<Integer>();
		// 初始化"猴子圈",确定每只猴子的编号。
		for (int i = 1; i <= amount; i++) {
			monkeys.add(i);
		}
		
		// 初始化报的数为1
		int i = 1;
		// 开始报数! 每一轮报数,都接着上次报的数i进行,"猴子圈"只剩1只猴子了就停止报数
		while (monkeys.size() > 1) {
			// 定义猴子编号数组,用于迭代"猴子圈"
			Integer[] monkeyNums = monkeys.toArray(new Integer[0]);
			// 迭代"猴子圈",作为一轮报数
			for (int monkeyNum : monkeyNums) {
				if (i < num) {
					// 下只猴子要报的数
					i++;
				} else {
					// 如果这只猴子报的数是num,就把它移出"猴子圈"
					monkeys.remove(monkeyNum);
					// 下只猴子报数从1开始
					i = 1;
				}
			}
		}
		
		// "猴子圈"的最后一只猴子做大王。
		int king = 0;
		for (int monkeyNum : monkeys) {
			king = monkeyNum;
		}
		
		System.out.println("大王是" + king + "号猴子");
	}

}



写完后,上论坛看到这楼牛人的回帖,大为汗颜

int findMonkey(int n, int m) 
{ 
    int r = 0; 
    for (int i = 2; i <= n; i++) 
        r = (r + m) % i; 
    return r+1; 
}


自从把Java当吃饭的家伙之后,脑子越来越笨了。

我解决问题的方式常常是模拟实际流程跑一遍,然后得出结果,根本不去考虑算法。

接下来准备买本数据结构和算法的书啃啃。
分享到:
评论
1 楼 coolbaby1984514 2010-05-07  
int findMonkey(int n, int m)
{
    int r = 0;
    for (int i = 2; i <= n; i++)
        r = (r + m) % i;
    return r+1;
}

没明白什么意思 哎!!

相关推荐

    javaTreeSet实现图书管理系统

    在Java编程语言中,`TreeSet` 是一种集合框架下的数据结构,它实现了SortedSet接口,提供了有序且无重复元素的存储。在这个“javaTreeSet实现图书管理系统”中,我们可以利用`TreeSet`的特性来构建高效且功能完备的...

    用java的TreeSet写的一个求并集算法

    本知识点主要探讨如何利用Java的`TreeSet`类来实现两个集合的并集算法。 `TreeSet`是基于红黑树(Red-Black Tree)的数据结构实现的,它提供了高效的插入、删除和查找操作,同时保持集合中的元素有序。红黑树是一种...

    JavaTreeSet实现摊位销售管理系统

    1.有一个水果销售摊位,销售3种水果,重量和单价各不相同,实现多次的销售业务 2.销售时如果为顾客为女性销售金额打8折 3.显示当前各种水果的库存数 4.查询全部销售记录信息 5.加入其它水果品种 6.添加进货单 7.查询...

    java算法 JOSEPH约瑟夫问题穷举算法解决 netbeans

    Java算法中的JOSEPH问题,也称为约瑟夫环问题,是一个经典的理论计算问题,源自古希腊的一个传说。这个问题的基本设定是,有一群人(或猴子,在此例中)围成一个圈,按照顺时针方向从某个人开始报数,数到特定数值的...

    Java SE程序 TreeSet类中自定义CompareTo类

    Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类Java SE程序 TreeSet类中自定义CompareTo类...

    java泛型 用了treeset

    使用TreeSet和Comparator,编写TreeSetTest2类,要求对TreeSet中的元素1-元素10进行排列,排序逻辑为奇数在前偶数在后,奇数按照升序排列,偶数按照降序排列。 如果需要的话可以下载,有写成文章的。有写了一点中文...

    Java TreeSet实现学生按年龄大小和姓名排序的方法示例

    Java TreeSet实现学生按年龄大小和姓名排序的方法示例 在 Java 中,TreeSet 是一...本文展示了如何使用 Java 的 TreeSet 和 Comparable 接口来实现学生按年龄大小和姓名排序的方法,这对 Java 开发人员来说非常有用。

    Java TreeSet类的简单理解和使用

    Java TreeSet类的简单理解和使用 Java TreeSet类是Set接口的一个实现类,主要作用是用于对对象的排序以及确定存入对象的唯一性。TreeSet类可以自动地对存入的对象进行排序,并且保证存入的对象的唯一性。 在使用...

    Java数据结构--13.Java8数据结构TreeSet.pdf

    在Java集合框架中,TreeSet是一个重要的数据结构,它是Set接口的实现类之一,与HashSet和LinkedHashSet不同,TreeSet具有排序功能,这是因为其不仅继承自AbstractSet,还实现了SortedSet和NavigableSet接口。...

    java 集合框架(TreeSet练习)

    在Java集合框架中,`TreeSet`是一个有序、不可重复的集合,它基于红黑树(Red-Black Tree)数据结构实现。`TreeSet`在许多场景下比其他集合如`ArrayList`或`HashSet`更有优势,因为它的元素总是按特定顺序排列,并且...

    java中treemap和treeset实现红黑树

    Java 中 TreeMap 和 TreeSet 实现红黑树 Java 中的 TreeMap 和 TreeSet 都是基于红黑树的数据结构实现的。红黑树是一种自平衡的排序二叉树,它可以保证在插入、删除和搜索操作时都能维持平衡,从而确保搜索、插入...

    java集合-TreeSet的使用

    TreeSet 是 Java 中的一个集合类,它实现了 SortedSet 接口,并且使用红黑树作为底层数据结构。TreeSet 具有以下主要特点: 排序性:TreeSet 中的元素是有序的,默认按照元素的自然顺序进行排序。或者,可以在创建 ...

    treeset 和 hashlist 实现的扑克牌游戏

    2. **TreeSet**:它是Java集合框架中`Set`接口的一个实现,基于红黑树数据结构。`TreeSet`保证了元素的排序性,无论是自然排序还是自定义比较器排序。它不允许有重复元素,并且提供了一种高效的查找、添加和删除元素...

    TreeSet 红黑树结构算法

    TreeSet 红黑树结构算法是 Java 中的一种数据结构,它是基于红黑树数据结构的实现。红黑树是一种自平衡的排序二叉树,它可以保证快速检索指定节点。TreeSet 和 TreeMap 之间存在着紧密的关系,下面我们将详细讲解 ...

    学生成绩排序(TreeSet方式实现)

    `TreeSet`是Java集合框架中的一个类,它继承自`AbstractSet`并实现了`NavigableSet`接口。`TreeSet`的主要特点就是它会自动按照一定的顺序对存储的元素进行排序。在这个场景下,我们使用`TreeSet`来实现学生成绩的...

    【IT十八掌徐培成】Java基础第12天-02.TreeSet实现与Comparable接口.zip

    在Java编程语言中,`TreeSet`是一个基于`TreeMap`实现的有序集合。它遵循了`SortedSet`接口,因此元素在集合中是按照特定的顺序排列的。本课程重点讲解了`TreeSet`如何实现`Comparable`接口以及如何自定义比较规则。...

    java中tree的实现

    文件`java实现树状关系图.htm`和`java实现树状关系图.files`可能包含了关于如何在Java中用图形方式表示树状结构的示例代码或资源,这通常涉及到Swing库中的`JTree`组件。`JTree`允许我们在GUI应用程序中创建交互式的...

    JavaTreeSet停车场管理系统

    停车场管理 1.一个停车场,内有多个车位,可停入各种车辆 2.只有具备车牌并高度低于3米的车辆可停入 3.停入时开始计费,按每小时2元 4.查询全部停车位的状态 5.按车牌及停车位号取车,取车时收停车费 ...

    Java中AVL平衡二叉树实现Map_(仿照TreeMap和TreeSet)1

    "Java中AVL平衡二叉树实现Map_(仿照TreeMap和TreeSet)1" 本文将详细介绍Java中AVL平衡二叉树实现Map的知识点,以便读者更好地理解和应用AVL树在Java中的实现。 一、AVL树的概念和特点 AVL树是一种自平衡二叉搜索...

    java实现最近点问题(带图像).doc

    总结:这个Java程序是用于解决二维平面上的最近点对问题的,它结合了图形界面和控制台输出,使用了`JFrame`和`JPanel`构建GUI,同时利用`TreeSet`作为数据结构存储点。虽然具体算法实现细节未完全展示,但可以看出它...

Global site tag (gtag.js) - Google Analytics