华为2014届机试题之约瑟夫环问题
2013-09-13 10:58
387 查看
package com.huawei.Joseph; import java.util.LinkedList; import java.util.Scanner; /** * 约瑟夫环问题: 1,2,...n编号的人顺时针围坐一圈,每人一个密码数n,给定一个起始整数m,从第一个人开始从1报数, * 到m时停止,该人出列,得到他的密码作为其实m,接着从下一个人开始从1重新报数,一次循环,直到所有人出列,按照出列顺序打印出出列人的编号 eg: 输入 6 * 3 6 5 4 3 2 1 ,空格分开的一组数字,第一个为n,第二个为m,以后的为n个人各自的密码 输出为 3 1 4 2 5 6 * * @author patrick * @date 10/9 2013 * */ public class Joseph { public static void main(String[] args) { LinkedList<Integer> jlist = new LinkedList<Integer>(); LinkedList<Integer> plist = new LinkedList<Integer>(); Scanner in = new Scanner(System.in); String s = in.nextLine(); if (!s.matches("[\\d+ ]*")) { System.err.println("input error !"); return; } String nums[] = s.split(" "); int n = Integer.parseInt(nums[0]);// number of people int m = Integer.parseInt(nums[1]);// original secret if (n > 10 || m > 10) { System.err .println("are you cray?how dare you input so many numbers,it's no need but waste my time!"); return; } if (nums.length < n + 2) { System.err .println("wrong input!,the number of people must match your input!"); return; } for (int i = 0; i < n; i++) { jlist.add(Integer.parseInt(nums[i + 2])); plist.add(i + 1); } int circleCount = 0; StringBuilder sb = new StringBuilder(); System.out.print("secret ="); while (jlist.size() > 0) { for (int i = 0; i < jlist.size(); i++) { circleCount++; if (circleCount == m) { m = jlist.get(i); System.out.print(m + "\t"); sb.append(plist.get(i)).append(" "); jlist.remove(i); plist.remove(i); i--; circleCount = 0; } } } System.out.println(); System.out.println("positon =" + sb.toString()); } }
相关文章推荐
- 约瑟夫环问题华为机试题
- 2014届华为校园招聘机试题一
- 篮子放球问题(华为软件面试试题之一)
- 2014届毕业生华为机试题(厦大场)
- 2014届华为校园招聘机试题
- 【华为机试题】操作系统任务调度问题
- 华为机试题(11)--约瑟夫问题
- 2017华为机试题--投骰子问题
- 华为机试题--排序问题
- 01背包问题,华为机试题
- 2014届华为校园招聘机试题
- 2014届华为校园招聘机试题
- 2014届华为校园招聘机试题2
- 2014届华为校园招聘机试题
- 华为2014届机试题之田忌赛马
- 2014届华为校园招聘机试题1
- 2014届华为校园招聘机试题
- 2014届华为校园招聘机试题
- 2014届华为校园招聘机试题
- 2014届华为校招软件类机试题(机试时间:2013年9月)