华为2014年7月7号下午3点30机试题-JAVA
初级题
求两个数的最小公倍数。
输入:2 3
输出:6
import java.util.Scanner;
public class Question1 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
System.out.println(minCommonMultiple(a,b));
}
private static int minCommonMultiple(int a, int b) {
// TODO Auto-generated method stub
int orgA = a;
int orgB = b;
int temp;
temp = a%b;
while(temp != 0){
a = b;
b = temp;
temp = a%b;
}
return orgA*orgB/b;
}
}
中级题
中国有句俗语叫“三天打鱼两天晒网”,给定起始日期为1990年1月1号,输入终止日期,计算终止日期是在打渔还是晒网,打渔输出Fishing,晒网输出Netting。
输入:1990 01 04
输出:Netting
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;
public class Question2 {
/**
* @param args
* @throws ParseException
*/
public static void main(String[] args) throws ParseException {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
String time = scanner.nextLine();
String doing = getDoing(time);
System.out.println(doing);
}
private static String getDoing(String time) throws ParseException{
// TODO Auto-generated method stub
SimpleDateFormat sdf = new SimpleDateFormat("yyyy MM dd");
Calendar cld = Calendar.getInstance();
cld.setTime(sdf.parse(time));
long end = cld.getTimeInMillis();
cld.setTime(sdf.parse("1990 01 01"));
long start = cld.getTimeInMillis();
long days = (end-start)/(1000*3600*24);
days = days%5;
if(days == 3 || days == 4){
return "netting";
}
return "fishing";
}
}
高级题
公司设备管理系统,某公司有许多员工和设备,每个员工有一个8位数字组成的ID,每台设备有个小于等于20位由数字和字母组成的设备号。
每个员工可以拥有多台设备,但是每台设备只能分配给一个员工使用。
输入四个数a,b,c,d
a:给这个系统添加多少台设备
b:从这个系统中删除多少台设备
c:添加设备和员工的对应关系
d:删除设备和员工的对应关系
之后是由这4个参数控制的输入序列
a行设备编号,若添加失败则输出"add computers error:"+设备号;成功不输出
b行删除设备的编号,若删除失败则输出"remove computers error:"+设备号;成功不输出
c行要分配给员工的设备,若添加失败则输出“assign computer error:”+设备号+“_”+员工号;成功不输出
d行要删除分配给员工的设备,若删除失败则输出"remover computer from worker error:"+设备号+“_”+员工号;成功不输出
最后要求输出总共的设备数目和排序输出员工和设备的对应关系(员工号+"_"+设备号)(先按照员工号进行排序,若员工有多台设备,则再按照设备号进行排序)。
如输入
3 2 2 1
SN001
SN002
SN003
SN003
SN004
SN002 12345678
SN001 12345678
SN001 12345678
输出:
remove computers error:SN004
1
12345678_SN002
import java.util.*;
public class Question3 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int a = 3, b = 2, c = 2, d = 1;
//所有设备
Set<String> computers = new TreeSet<String>();
//所有员工
Set<String> workers = new TreeSet<String>();
//所有分配给员工的设备
Set<String> result = new TreeSet<String>();
//已经分配的设备
Set<String> hasAssignComp = new TreeSet<String>();
//如果设备集合当中不存在该设备添加设备
for(int i = 0; i < a; i++){
String comp = scanner.nextLine();
if(!computers.add(comp)){
System.out.println("add computers error:"+comp);
}
}
//如果设备集合当中存在该设备删除该设备
for(int i = 0; i < b; i++){
String comp = scanner.nextLine();
if(!computers.contains(comp)){
System.out.println("remove computers error:"+comp);
continue;
}
computers.remove(comp);
}
//如果设备集合中存在设备并且已分配的设备集合中不存在该设备
//则添加该设备
for(int i = 0; i < c; i++){
String input = scanner.nextLine();
String[] re = input.split(" ");
if(!computers.contains(re[0])||hasAssignComp.contains(re[0])){
System.out.println("assign computer error:"+re[0]+"_"+re[1]);
continue;
}
result.add(re[1]+"_"+re[0]);
workers.add(re[1]);
hasAssignComp.add(re[0]);
}
//如果已分配的设备集合中存在该设备,则从已分配集合中删除该设备
//设备总集合当中不删除该设备
for(int i = 0; i < d; i++){
String input = scanner.nextLine();
String[] re = input.split(" ");
if(!hasAssignComp.contains(re[0])||!result.contains(re[1]+"_"+re[0])){
System.out.println("remover computer from worker error:"+re[0]+"_"+re[1]);
continue;
}
result.remove(re[1]+"_"+re[0]);
hasAssignComp.remove(re[0]);
}
//输出总共有多少台设备
System.out.println(computers.size());
//排序输出员工和分配给该员工的设备
Iterator<String> iter = result.iterator();
while(iter.hasNext()){
System.out.println(iter.next());
}
}
}
以上代码仅供参考 ,欢迎大家多多指正。如果有更好的方法,希望大家给出更好解法。