华为2013机试题

1、约瑟夫环问题

package com.patrick.bishi;

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

}
2、广义田忌赛马

package com.patrick.bishi;

import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

/**
 * 广义田忌赛马:每匹马都有一个能力指数,齐威王先选马,田忌后选,马的能力相同,则齐威王胜。
 * 输入:马匹数量 \n 齐威王的马匹能力值 \n 田忌的马匹能力值(能力值之间都是以空格分开) 
 * eg:输入:3 \n 1 2 3 \n 1 2 3 输出:2
 * @author patrick
 * 
 */
public class TianJiSaima {
	public static void main(String args[]) {
		List<Integer> lTian = new ArrayList<Integer>();
		List<Integer> lQi = new ArrayList<Integer>();
		Scanner in = new Scanner(System.in);
		System.out.println("参加赛马的马匹数量:");
		int n = Integer.parseInt(in.nextLine().trim());
		// 先得到齐威王的田忌的能力值
		System.out.println("齐威王的马匹能力值:");
		String qi = in.nextLine().trim();
		// 然后得到田忌的田忌的能力值
		System.out.println("田忌的马匹能力值:");
		String tian = in.nextLine().trim();
		if (!tian.matches("[\\d+ ]*") || !qi.matches("[\\d+ ]*")) {
			System.err.println("input error !");
			return;
		}
		String[] tAblity = tian.split(" ");
		String[] qAblity = qi.split(" ");
		if (tAblity.length != n || qAblity.length != n) {
			System.err.println("the number of horses wrong !");
			return;
		}
		for (int i = 0; i < n; i++) {
			lTian.add(Integer.parseInt(tAblity[i]));
			lQi.add(Integer.parseInt(qAblity[i]));
		}
		Collections.sort(lTian);
		Collections.sort(lQi);

		int i = 0, j = 0, x = n - 1, y = n - 1, cnt = 0;
		boolean bLast = true;

		while (bLast) {
			// 是否是最后一匹马
			if (x == i)
				bLast = false;
			if (lTian.get(x) > lQi.get(y)) {// 如果田忌当前最好的马可以胜齐王最好的马,那么比一场
				x--;
				y--;
				cnt += 1;
			} else if (lTian.get(i) > lQi.get(j)) {// 如果田忌当前最差的马可以胜齐王最差的马,那么比一场
				i++;
				j++;
				cnt += 1;
			} else {// 否则,让田忌最差的马和齐王最好的好比一场
				i++;
				y--;
			}
		}
		System.out.println("田忌可以赢得赛马的场数为 " + cnt + " 场。");
		lTian.clear();
		lQi.clear();
	}
}













你可能感兴趣的:(笔试)