2017华为机试题--全排列问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于2017华为机试题--全排列问题的主要内容,如果未能解决你的问题,请参考以下文章

华为OD机试独家提供C语言题解 - 最大排列

华为OD机试题,用 Java 解运动会问题 | 含解题说明

独家华为OD机试提供C语言题解 - 第 N 个排列

华为机试题 HJ35蛇形矩阵

华为笔试题

华为OD机试题,用 Java 解找出符合要求的字符串子串问题 | 含代码编写思路