您的位置:首页 > 其它

华为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());
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: