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 }
时间: 2024-08-27 15:04:32

2017华为机试题--全排列问题的相关文章

2017华为机试题--水仙花数

等了一个月终于等到华为给安排的实习生在线机试,把自己做的三道题记录了一下,也方便日后复习.这篇是第一题,没有什么特别的难度,经典的水仙花数题. 题目描述:水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身.(例如:13+53+33=153),要求:输出1000范围内所有水仙花数及水仙花数之和. 输入描述:无 输出描述:1000以内所有水仙花数及总和. 输出例子: 第1个水仙花数:xxx 第2个水仙花数:xxx 第3个水仙花数:xxx ... 水仙花数总和为:xxx 1 p

2017华为机试题--投骰子问题

题目描述:骰子是一个立方体,每个面一个数字,初始为左1,右2,前3(观察者方向),后4,上5,下6,用123456表示这个状态,放置到平面上,可以向左翻转(用L表示向左翻转1次),可以向右翻转(用R表示向右翻转1次),可以向前翻转(用F表示向前翻转1次),可以向后翻转(用B表示向右翻转1次),可以逆时针旋转(用A表示逆时针旋转90度),可以顺时针旋转(用C表示逆时针旋转90度),现从初始状态开始,根据输入的动作序列,计算得到最终的状态. 输入描述: 初始状态为:123456 输入只包含LRFBA

2017华为机试题--Floyd算法

小K是X区域的销售经理,他平常常驻"5"城市,并且经常要到"1"."2"."3"."4"."6"城市出差.当机场出现大雾情况时,会导致对应城市的所有航班的起飞及降落均停止(即不能从该城市出发,其他城市也不能到达该城市).小K希望知道如果他需要到X城市出差时,如果遇到Y城市出现大雾,他最短的飞行时间及飞行路径. 注意:当两个城市间不可达时,消耗时间默认取1000. 各城市简的飞行时间如下表

2017华为机试题--任务调度

题目描述:输入5个任务的ID,任务优先级,开始运行时间和任务运行时间,其中调度过程支持抢占,即优先级值高的任务可抢占正在运行的优先级值低的任务,最后输出前200秒,任务的调度过程 输入描述:任务信息输入格式为:[任务ID.任务优秀级.任务开始运行时间.任务运行时长]:任务与任务之间使用"|"隔离:5个任务的任务ID为1-5:任务优先级范围为0-200. 输入例子:[1.80.1.10]|[2.20.11.15]|[3.50.21.10]|[4.120.31.10]|[5.100.41.

华为机试题【12】-关灯泡

题目描述: 描述: 一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.开始,电灯全部关着. 有n个学生从长廊穿过.第一个学生把号码凡是1的倍数的电灯的开关拉一下:接着第二个学生把号码凡是2的倍数的电灯的开关拉一下:接着第三个学生把号码凡是3的倍数的电灯的开关拉一下:如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下.n个学生按此规定走完后,长廊里电灯有几盏亮着. 注:电灯数和学生数一致. 运行时间限制: 无限

华为机试题3

[编程题] 明明的随机数 明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤1000),对于其中重复的数 字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号.然后再把这些数从小到大排序,按照排好的顺序去找同学做调查.请你协助明明完成 “去重”与“排序”的工作. Input Param n               输入随机数的个数 inputArray      n个随机整数组成的数组 Return Value

华为机试题【10】-求数字基root

题目描述: 求整数的Root:给定正整数,求每位数字之和;如果和不是一位数,则重复; 输入:输入任意一个或多个整数 输出:输出各位数字之和,直到和为个位数为止(输入异常,则返回-1),多行,每行对应一个输入数据的结果. 样例输入: 25 865 样例输出: 7 1 思路分析: 首先求个位数相加,经典方法,求余相除 要求各个位数的和是小于10,可以采用递归或者循环 代码: import java.util.Scanner; public class Main { static int[] num

华为机试题【11】-报数删除人

题目描述: 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出,问最后留下的那位是原来第几号. 思路分析: 首先是选好数据结构,轻量级的boolean数组,下边代表序号,全部初始化位true 退出变为false,设置全局变量int a,遍历数组,a++(当对应为false时候,continue跳过) 遍历数组统计true的数量,为1时候退出 注意: 如果要用List来存储,注意遍历remove删除时候,要一致,不能list和iterator混用 代码: import

华为机试题【3】

题目: 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A,2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):) 3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER 输入两手牌,两手牌之间用"-"连接,每手牌的每张牌以空格分隔,"-"两边没有空格,如:4 4 4 4-joker JOKER 请比较两手牌大小,输出较大的牌,如果不存在比较关系则输出ERROR 基