论坛首页 Java企业应用论坛

淘宝面试题 n个人围成一圈,报到m的人出列

浏览 20413 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (2)
作者 正文
   发表时间:2011-04-20  
简单实现,未做“求最后一个出列的人”处理。

输出的最后一个数值就是“最后一个出列的人”

public class ReportNumber {

	public static void main(String[] args) throws Exception {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		System.out.print("please input two numbers : ");
		
		String[] strings = br.readLine().replaceAll("\\s+", "").split(",");
		
		int m = Integer.parseInt(strings[0]);
		
		int n = Integer.parseInt(strings[1]);
		
		LinkedList<Integer> linkedList = new LinkedList<Integer>();
		
		for (int i = 1; i <= n; i++) {
			
			linkedList.add(i);
		}
		
		for (int i = 0, j = 1; !linkedList.isEmpty(); i++, j++) {
			
			// 如[报数报程中]下标指针到达链表尾部,须从头开始重新报数
			if (i == linkedList.size()) {
				
				i = 0;
			}
			
			if (j == m) {
				
				System.out.printf("%d ", linkedList.remove(i));
				
				// 如[报数完成后]下标指针下标指针到达链表尾部,须从头开始重新报数
				if (i == linkedList.size()) {
					
					i = 0;
				}
				
				j = 1;
			}
		}
	}
}
0 请登录后投票
   发表时间:2011-04-20  
bosshida 写道
sunlightcs 写道
useryouyou 写道
if(arr[index] == true){

这个有问题吗?


没问题,不过他想表达的意思是:一般判断true或false,不用“ == ”,直接if(arr[index])就可以了

哦,呵呵 
0 请登录后投票
   发表时间:2011-04-20  
147091224 写道
简单实现,未做“求最后一个出列的人”处理。

输出的最后一个数值就是“最后一个出列的人”

public class ReportNumber {

	public static void main(String[] args) throws Exception {
		
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		System.out.print("please input two numbers : ");
		
		String[] strings = br.readLine().replaceAll("\\s+", "").split(",");
		
		int m = Integer.parseInt(strings[0]);
		
		int n = Integer.parseInt(strings[1]);
		
		LinkedList<Integer> linkedList = new LinkedList<Integer>();
		
		for (int i = 1; i <= n; i++) {
			
			linkedList.add(i);
		}
		
		for (int i = 0, j = 1; !linkedList.isEmpty(); i++, j++) {
			
			// 如[报数报程中]下标指针到达链表尾部,须从头开始重新报数
			if (i == linkedList.size()) {
				
				i = 0;
			}
			
			if (j == m) {
				
				System.out.printf("%d ", linkedList.remove(i));
				
				// 如[报数完成后]下标指针下标指针到达链表尾部,须从头开始重新报数
				if (i == linkedList.size()) {
					
					i = 0;
				}
				
				j = 1;
			}
		}
	}
}



这样也行了,我哪只是用了一些基础类型实现的了,没有用到LinkedList   
0 请登录后投票
   发表时间:2011-04-20  
唉,我讨厌算法题。
0 请登录后投票
   发表时间:2011-04-20  
约瑟夫环问题
用个单向循环链表 更好理解
当节点的下结点是他本身的时候就得出答案了
当然链表也可以看着特殊的数组
0 请登录后投票
   发表时间:2011-04-20  
public int find(int n, int m)
	{
		int r = 0;
		for (int i = 2; i <= n; i++) {
			r = (r + m) % i;
		}
		return r + 1;
	}


以前在论坛里看到过一个实现,说实话我没看懂,但是试了几个都是正确的,希望数学好的朋友来解释下.
0 请登录后投票
   发表时间:2011-04-20  
算法可能楼主的没有问题,从面向对象的角度来看,楼主的算法不合格,下面找了个代码,大家看下是否会逻辑更清晰。
public class Josephus {
	static class Node {
		int val;
		Node next;

		Node(int v) {
			val = v;
		}
	}// 成员类,代表节点,类似于数据结构中的结构体

	public static void main(String[] args) {
		int N = 9;// 这个表示总人数
		int M = 5;// 数到几的人出列
		Node t = new Node(1);// 头节点单列出来,方便形成循环链表
		Node x = t;

		for (int i = 2; i <= N; i++)
			x = (x.next = new Node(i));// 建立单向链表
		x.next = t;// 最后一个节点的next指向第一个节点,形成循环链表
		System.out.println("出圈的顺序为:");
		while (x != x.next) {
			for (int i = 1; i < M; i++)
				x = x.next;
			// 此时x是将出列的节点的前一个节点
			System.out.print(x.next.val + " ");
			x.next = x.next.next;
		}
		System.out.println();
		System.out.println("Survivors is " + x.val);
	}// end main
}

参考地址:http://yxxiao0929.blog.chinajavaworld.com/entry/8129/0/
0 请登录后投票
   发表时间:2011-04-20  
albertshaw 写道
public int find(int n, int m)
	{
		int r = 0;
		for (int i = 2; i <= n; i++) {
			r = (r + m) % i;
		}
		return r + 1;
	}


以前在论坛里看到过一个实现,说实话我没看懂,但是试了几个都是正确的,希望数学好的朋友来解释下.



终于找到这个解法
0 请登录后投票
   发表时间:2011-04-20  
我记得 5行就可以搞定的
0 请登录后投票
   发表时间:2011-04-20  
albertshaw 写道
public int find(int n, int m)
	{
		int r = 0;
		for (int i = 2; i <= n; i++) {
			r = (r + m) % i;
		}
		return r + 1;
	}


以前在论坛里看到过一个实现,说实话我没看懂,但是试了几个都是正确的,希望数学好的朋友来解释下.

f(1,m)=0
f(n,m)=(f(n-1,m)+m)%n
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics