2017华为机试题--全排列问题
题目描述:小明负责公司年会,想出一个趣味游戏:屏幕给出1~9中任意3个不重复的数字,大家以最快时间给出这几个数字可拼成的数字从小到大排列位于第N位置的数字,其中N为给出的数字中最大的(如果不到这么多个数字则给出最后一个即可),谁最快给出谁得奖。
注意:
(1)屏幕如果给出的是“2”,大家可把它当作“2”,也可把它当作“5”来拼接数字;同理,如果屏幕给的是“5”,大家可把它当作“5”,也可以把它当作“2”来拼接数字,但屏幕不能同时给出“2”和“5”。
(2)屏幕如果给出的是“6”,大家可把它当作“6”,也可把它当作“9”来拼接数字;同理,如果屏幕给的是“9”,大家可把它当作“9”,也可以把它当作“6”来拼接数字,但屏幕不能同时给出“6”和“9”。
现在需要编写一个小程序,根据给出的数字计算出能组合的所有2数字以及最终的正确答案。
如:给出:1,4,8,则可以拼成的数字为:
1,4,8,14,18,41,48,81,84,148,184,418,481,814,841
那么最第N(即8)个的数字为81.
输入描述:以逗号为分隔,描述3个int类型整数的字符串。
输出描述:这几个数字可拼成的数字从小到大排列位于第N(N为输入数字中最大的数字)位置的数字,如果输入的数字为负数或者不是合法的字符串或者有重复,返回-1。
输入例子:1,4,8
输出例子:81
代码如下:
1 import java.util.ArrayList; 2 import java.util.Collections; 3 import java.util.HashSet; 4 import java.util.Scanner; 5 import java.util.Set; 6 7 public class add2 { 8 public static void addThreeNumbers(ArrayList<Integer> lst, int a, int b, int c) { 9 lst.add(a); 10 lst.add(b); 11 lst.add(c); 12 lst.add(a * 10 + b); 13 lst.add(a * 10 + c); 14 lst.add(b * 10 + a); 15 lst.add(b * 10 + c); 16 lst.add(c * 10 + a); 17 lst.add(c * 10 + b); 18 19 lst.add(a * 100 + b * 10 + c); 20 lst.add(a * 100 + c * 10 + b); 21 lst.add(b * 100 + a * 10 + c); 22 lst.add(b * 100 + c * 10 + a); 23 lst.add(c * 100 + b * 10 + a); 24 lst.add(c * 100 + a * 10 + b); 25 } 26 27 public static void remove(ArrayList<Integer> lst) { //去除重复数字 28 Set<Integer> set = new HashSet<Integer>(); 29 for(Integer x : lst) 30 set.add(x); 31 lst.removeAll(lst); 32 for(Integer x : set) 33 lst.add(x); 34 } 35 36 public static boolean check(String line) { //判断输入的字符是否为合法的字符:只能为数字和, 37 for(int i = 0; i < line.length(); i++) { 38 char ch = line.charAt(i); 39 if(!(Character.isDigit(ch) || ch == ',')) 40 return false; 41 } 42 return true; 43 } 44 45 public static void main(String[] args) { 46 Scanner scan = new Scanner(System.in); 47 48 String line = scan.nextLine(); 49 String[] numbers = line.split(","); 50 if(!check(line) || numbers.length != 3) { 51 System.out.println(-1); 52 return; 53 } 54 int a = 0, b = 0, c = 0; 55 try{ 56 a = Integer.parseInt(numbers[0]); 57 b = Integer.parseInt(numbers[1]); 58 c = Integer.parseInt(numbers[2]); 59 } catch(Exception ex) { 60 System.out.println(-1); 61 return; 62 } 63 64 if(a <= 0 || a > 9 || b <= 0 || b > 9 || c <= 0 || c > 9) { 65 System.out.println(-1); 66 return; 67 } 68 69 if(a == b || a == c || b == c) { //判断是否有相同数字的情况 70 System.out.println(-1); 71 return; 72 } 73 74 Set<Integer> s = new HashSet<Integer>(); //判断是否有同时存在2和5、6和9的情况 75 s.add(a); s.add(b); s.add(c); 76 if((s.contains(2) && s.contains(5)) || (s.contains(6) && s.contains(9))) { 77 System.out.println(-1); 78 return; 79 } 80 // int m = -1; 81 // if(s.contains(2)) 82 // m = 5; 83 // if(s.contains(6)) 84 // m = 9; 85 86 int max = Math.max(a, Math.max(c, b)); 87 88 ArrayList<Integer> lst = new ArrayList<Integer>(); 89 90 addThreeNumbers(lst, a, b, c); // 对2和5、6和9的转换 91 if(a == 2 || a == 5) 92 addThreeNumbers(lst, 7 - a, b, c); 93 if(b == 2 || b == 5) 94 addThreeNumbers(lst, a, 7 - b, c); 95 if(c == 2 || c == 5) 96 addThreeNumbers(lst, a, b, 7 - c); 97 98 if(a == 6 || a == 9) 99 addThreeNumbers(lst, 15 - a, b, c); 100 if(b == 6 || b == 9) 101 addThreeNumbers(lst, a, 15 - b, c); 102 if(c == 6 || c == 9) 103 addThreeNumbers(lst, a, b, 15 - c); 104 105 //考虑2和6、9或者5和6、9同时存在的情况 106 if((s.contains(2) || s.contains(5)) && (s.contains(6) || s.contains(9))) { 107 int x = s.contains(2)? 2 : 5; 108 int y = s.contains(6)? 6 : 9; 109 int z = a + b + c - x - y; 110 addThreeNumbers(lst, 7 - x, 15 - y, z); 111 } 112 113 remove(lst); 114 115 Collections.sort(lst); 116 // System.out.println(lst); 117 System.out.println(lst.get(max - 1)); 118 } 119 }