华为优招笔试题
一、报文翻译
输入一行报文,每个数据都是十六进制格式,且以空格隔开,第一个元素是报文长度;
翻译规则是:将“A”翻译成“12”和“34”,将“B”翻译成“AB”和“CD”;
输出转换后的报文长度以及报文内容
public class hwyz1 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while(sc.hasNext()) { String[] ss = sc.nextLine().split(" "); int n = Integer.parseInt(ss[0], 16); ArrayList<String> arr = new ArrayList<>(); for (int i = 1; i <= n; i++) { String s = ss[i]; if (s.equals("A")) { arr.add("12"); arr.add("34"); }else if (s.equals("B")) { arr.add("AB"); arr.add("CD"); }else { arr.add(s); } } System.out.print(Integer.toString(arr.size(), 16).toUpperCase() + " "); for (String s : arr) { System.out.print(s + " "); } } } }
注意:输出的长度数据要以十六进制输出,且大写!
二、找质数相关的一道题
给定一个数据范围,找出范围内的所有质数,将这些质数的个位数相加得到m,将这些质数的十位数相加得到n,输出较小的那一个
public class hwyz2 { public static void main(String[] args) { Scanner in = new Scanner(System.in); int min = in.nextInt(); int max = in.nextInt(); int m10 = 0; int m1 = 0; for (int ii = min; ii < max; ii++) { if (isRightNum(ii)) { System.out.println("sushu: "+ii); int temp = ii%10; m1 += temp; m10 += (ii%100 - temp)/10; } } System.out.println(Math.min(m10, m1)); } //判断是不是质数,用了孪生素数的方式 //所有大于等于5的质数,都满足(6k+1)或(6k-1) public static boolean isRightNum(int numb) { if (numb == 2 || numb == 3) { return true; } if (numb%6 != 1 && numb%6 != 5) { return false; } int tmp = (int)Math.sqrt(numb); for (int i = 5; i <= tmp; i += 6) { if (numb%i == 0 || numb%(i+2) == 0) { return false; } } return true; } }
三、收到群聊消息的总人数
先输入发消息的人的名称,再输入多个数组代表多个群聊以及群中的人数,问一共有多少人收到这条消息?
构造图,再根据起点进行DFS计算顶点数量,这种解法通过率只有50%