华为od机试题1 真题
华为od机试题 真题
- 86.射击比赛成绩排序
- 85.计算屏幕字母数量
- 84.组成最大数字
- 82.输出字符串中最小数字
- 81.数字4的个数
- 80.整数排列
- 79.多条件排列
- 78.时间排序
以下题目附带Java解法,是我个人写的,不一定是标准答案,没有真正的测试数据,只能说是我自己认为通过率100%,也不一定是最优解。如果有错误或是有更好的解法,请评论告诉我!!!
86.射击比赛成绩排序
给定一个射击比赛成绩单
包含多个选手若干次射击的成绩分数
请对每个选手按其最高三个分数之和进行降序排名
输出降序排名后的选手id序列
条件如下
1. 一个选手可以有多个射击成绩的分数,且次序不固定
2. 如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手
3. 如果选手的成绩之和相等,则相等的选手按照其id降序排列输入描述:输入第一行一个整数N表示该场比赛总共进行了N次射击产生N个成绩分数2<=N<=100输入第二行一个长度为N整数序列表示参与每次射击的选手id0<=id<=99输入第三行一个长度为N整数序列表示参与每次射击选手对应的成绩0<=成绩<=100输出描述:符合题设条件的降序排名后的选手ID序列示例一输入:133,3,7,4,4,4,4,7,7,3,5,5,553,80,68,24,39,76,66,16,100,55,53,80,55输出:5,3,7,4说明:该场射击比赛进行了13次参赛的选手为{3,4,5,7}3号选手成绩53,80,55 最高三个成绩的和为1884号选手成绩24,39,76,66 最高三个成绩的和为1815号选手成绩53,80,55 最高三个成绩的和为1887号选手成绩68,16,100 最高三个成绩的和为184比较各个选手最高3个成绩的和有3号=5号>7号>4号由于3号和5号成绩相等 且id 5>3所以输出5,3,7,4
// 射击比赛成绩排序
public static void test086() {Scanner sc = new Scanner(System.in);String line1 = sc.nextLine();String line2 = sc.nextLine();String line3 = sc.nextLine();String[] strings2 = line2.split(",");String[] strings3 = line3.split(",");// 用Map存储,key存选手号,value用list存选手所有的成绩Map<Integer, List<Integer>> map = new HashMap<>();for (int i = 0; i < Integer.parseInt(line1); i++) {if (map.containsKey(Integer.parseInt(strings2[i]))) {List<Integer> list = map.get(Integer.parseInt(strings2[i]));list.add(Integer.parseInt(strings3[i]));} else {List<Integer> list = new ArrayList<>();list.add(Integer.parseInt(strings3[i]));map.put(Integer.parseInt(strings2[i]), list);}}Map<Integer, Integer> map2 = new HashMap();// 遍历Map,对选手成绩进行筛选,用一个Map<Integer, Integer>来存选手号和最大总成绩for (Integer key : map.keySet()) {List<Integer> list = map.get(key);int listSize = list.size();if (listSize >= 3) {Collections.sort(list);// 最大总成绩int listAll = list.get(listSize - 1) + list.get(listSize - 2) + list.get(listSize - 3);map2.put(key, listAll);}}// 用于拼接输出结果StringBuilder builder = new StringBuilder();// 通过stream流的形式进行排序 sorted:对集合进行排序 e1与e2比较,结果大于0互换位置 小于等于0不变Set<Map.Entry<Integer, Integer>> entries = map2.entrySet();entries.stream().sorted((e1, e2) -> {if (e1.getValue().equals(e2.getValue())) {// 分数相等,选手号大的在前return e2.getKey() - e1.getKey();} else {// 分数大的在前return e2.getValue() - e1.getValue();}}).forEach((e) -> {builder.append(e.getKey() + ",");});System.out.println(builder.substring(0, builder.length() - 1));}
85.计算屏幕字母数量
有一个特殊的五键键盘
上面有A、Ctrl-C、Ctrl-X、Ctrl-V、Ctrl-A
A键在屏幕上输出一个字母A
Ctrl-C将当前所选的字母复制到剪贴板
Ctrl-X将当前选择的字母复制到剪贴板并清空所选择的字母
Ctrl-V将当前剪贴板的字母输出到屏幕
Ctrl-A选择当前屏幕中所有字母
注意:1. 剪贴板初始为空2. 新的内容复制到剪贴板会覆盖原有内容3. 当屏幕中没有字母时,Ctrl-A无效4. 当没有选择字母时Ctrl-C、Ctrl-X无效5. 当有字母被选择时A和Ctrl-V这两个输出功能的键,会先清空所选的字母再进行输出给定一系列键盘输入,
输出最终屏幕上字母的数量输入描述:输入为一行为简化解析用数字12345分别代替A、Ctrl-C、Ctrl-X、Ctrl-V、Ctrl-A的输入数字用空格分割输出描述:输出一个数字为屏幕上字母的总数量示例一:输入:1 1 1输出:3示例二:输入:1 1 5 1 5 2 4 4输出:2
// 计算屏幕字母数量public static void test085() {Scanner sc = new Scanner(System.in);String line = sc.nextLine();String[] split = line.split(" ");// 屏幕内容int result = 0;// 剪切板内容int ctrl_c_x = 0;// ctrl_A选中的内容int ctrl_a = 0;for (int i = 0; i < split.length; i++) {if (1 == Integer.parseInt(split[i])) { // A// Ctrl-A 选中内容,输入A则覆盖,屏幕内容长度为1if (ctrl_a != 0) {result = 1;} else { // Ctrl-A 没选中内容,输入A屏幕内容长度加1result++;}ctrl_a = 0;} else if (2 == Integer.parseInt(split[i])) { // Ctrl-C// 当Ctrl-A 选中内容时,Ctrl-C才有效if (0 != ctrl_a) {// 剪切板内容等于ctrl_A选中的内容ctrl_c_x = ctrl_a;}} else if (3 == Integer.parseInt(split[i])) { // Ctrl-X// 当Ctrl-A 选中内容时,Ctrl-X才有效if (0 != ctrl_a) {// 剪切板内容等于ctrl_A选中的内容ctrl_c_x = ctrl_a;// Ctrl-X后屏幕内容长度为0result = 0;// Ctrl-X后ctrl_A选中内容长度为0ctrl_a = 0;}} else if (4 == Integer.parseInt(split[i])) { // Ctrl-V// 当剪切板有内容ctrl_v才有用 // PS:这里有个疑问:当剪切板为空时,使用Ctrl-V是用空覆盖还是无效呢??我的处理是无效,我觉得这里题目描述的不是很清楚if (0 != ctrl_c_x) {// Ctrl-A 选中内容时if (ctrl_a != 0) {result = ctrl_c_x;ctrl_a = 0;} else if (ctrl_a == 0) { // Ctrl-A 没选中内容时result += ctrl_c_x;}}} else if (5 == Integer.parseInt(split[i])) { // Ctrl-A// 选中屏幕所有内容ctrl_a = result;}}System.out.println(result);}
84.组成最大数字
小组中每位都有一张卡片
卡片是6位以内的正整数
将卡片连起来可以组成多种数字
计算组成的最大数字输入描述:","分割的多个正整数字符串不需要考虑非数字异常情况小组种最多25个人输出描述:最大数字字符串示例一输入22,221输出22221示例二输入4589,101,41425,9999输出9999458941425101
// 组成最大数字public static void test0843() {Scanner sc = new Scanner(System.in);String line = sc.nextLine();String[] split = line.split(",");// 类似于冒泡排序,用双层for循环,将最大的组合往前放for (int i = 0; i < split.length - 1; i++) {for (int j = i + 1; j < split.length; j++) {String res1 = split[i] + split[j];String res2 = split[j] + split[i];if (Integer.parseInt(res1) < Integer.parseInt(res2)) {String value = split[i];split[i] = split[j];split[j] = value;}}}for (int i = 0; i < split.length; i++) {System.out.print(split[i]);}}
82.输出字符串中最小数字
1.输入字符串s输出s中包含所有整数的最小和,说明:1字符串s只包含a~z,A~Z,+,-,
2.合法的整数包括正整数,一个或者多个0-9组成,如:0,2,3,002,102
3.负整数,负号开头,数字部分由一个或者多个0-9组成,如-2,-012,-23,-00023输入描述:包含数字的字符串输出描述:所有整数的最小和
示例:输入:bb1234aa输出10输入:bb12-34aa输出:-31说明:1+2-(34)=-31
// 输出字符串中最小数字public static void test082() {Scanner sc = new Scanner(System.in);String line = sc.nextLine();// 将字符串转为字符数组char[] chars = line.toCharArray();// 累加结果int sum = 0;for (int i = 0; i < chars.length; i++) {char c = chars[i];if (c == '-') {int start = i;i++;while (i < chars.length && Character.isDigit(chars[i])) {i++;}// 截取负数String substring = line.substring(start, i);// 当substring = 1时只有一个负号if (substring.length() > 1) {sum += Integer.parseInt(substring);}}// 判断字符是不是数字if (Character.isDigit(c)) {// 将字符数字转为数字,当字符数字小于第二个参数时,返回-1sum += Character.digit(c, 10);}}System.out.println(sum);}
81.数字4的个数
程序员小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。
出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。比如:1. 23再多一块钱就变为25;2. 39再多一块钱变为50;3. 399再多一块钱变为500;小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋。给出计费表的表面读数,返回实际产生的费用。输入描述:只有一行,数字N,表示里程表的读数。(1<=N<=888888888)。
输出描述:一个数字,表示实际产生的费用。以回车结束。
示例1:
输入5
输出4
说明5表示计费表的表面读数。表示实际产生的费用其实只有4块钱。示例2:
输入17
输出15
说明17表示计费表的表面读数。15表示实际产生的费用其实只有15块钱。
示例3:
输入100
输出81
说明:100表示计费表的表面读数,81表示实际产生的费用其实只有81块钱
// 数字4的个数public static void test081(){Scanner sc = new Scanner(System.in);int start = sc.nextInt();// 数字中有4的个数int sum = 0;for (int i = 1; i <= start; i++) {// 将数字转为字符串,判断数字是否包含4if ((i+"").contains("4")) {// 累加sum++;}}System.out.println(start - sum);
80.整数排列
给定参数n,从1到n会有n个整数:1,2,3,...,n,这n个数字共有n!种排列.按大小顺序升序列出所有排列的情况,并一一标记,当n=3时,所有排列如下:"123" "132" "213" "231" "312" "321"给定n和k,返回第k个排列.输入描述:输入两行,第一行为n,第二行为k,给定n的范围是[1,9],给定k的范围是[1,n!]。输出描述:输出排在第k位置的数字。实例1:输入:33输出:213说明3的排列有123,132,213...,那么第三位置就是213实例2:输入22输出:21说明2的排列有12,21,那么第二位置的为21
// 整数排列 这道题目前还不懂,稍后总结public static void test080(){Scanner in = new Scanner(System.in);int n = Integer.parseInt(in.nextLine());int k = Integer.parseInt(in.nextLine());StringBuilder sb = new StringBuilder();List<Integer> candidates = new ArrayList<>();int[] factorials = new int[n + 1];factorials[0] = 1;int fact = 1;for (int i = 1; i <= n; ++i) {candidates.add(i);fact *= i;factorials[i] = fact;}k -= 1;for (int i = n - 1; i >= 0; --i) {// 计算候选数字的indexint index = k / factorials[i];sb.append(candidates.remove(index));k -= index * factorials[i];}System.out.println(sb);}
79.多条件排列
某学校举行运动会,学生们按编号(1、2、3.....n)进行标识,
现需要按照身高由低到高排列,
对身高相同的人,按体重由轻到重排列,
对于身高体重都相同的人,维持原有的编号顺序关系。
请输出排列后的学生编号输入描述:两个序列,每个序列由N个正整数组成,(0<n<=100)。第一个序列中的数值代表身高,第二个序列中的数值代表体重,输出描述:排列结果,每个数据都是原始序列中的学生编号,编号从1开始,实例一:输入:4100 100 120 13040 30 60 50输出:2134
// 多条件排列public static void test079() {Scanner sc = new Scanner(System.in);int len = Integer.parseInt(sc.nextLine());// 身高String line1 = sc.nextLine();// 体重String line2 = sc.nextLine();String[] split1 = line1.split(" ");String[] split2 = line2.split(" ");// map的key为编号,value为学生的身高、体重组成的listMap<Integer, List<Integer>> map = new HashMap<>();for (int i = 1; i <= len; i++) {List<Integer> list = new ArrayList<>();// 身高list.add(Integer.parseInt(split1[i - 1]));// 体重list.add(Integer.parseInt(split2[i - 1]));map.put(i, list);}Set<Map.Entry<Integer, List<Integer>>> entrySet = map.entrySet();// 通过stream流的形式进行排序 sorted:对集合进行排序 s1与s2比较,结果大于0互换位置 小于等于0不变entrySet.stream().sorted((s1, s2) -> {List<Integer> value1 = s1.getValue();List<Integer> value2 = s2.getValue();// 身高相等比体重return value1.get(0) == value2.get(0) ? value1.get(1) - value2.get(1) : value1.get(0) - value2.get(0);}).forEach((s) -> {System.out.print(s.getKey());});}
78.时间排序
运维工程师采集到某产品线网运行一天产生的日志n条现需根据日志时间先后顺序对日志进行排序日志时间格式为H:M:S.NH表示小时(0~23)M表示分钟(0~59)S表示秒(0~59)N表示毫秒(0~999)时间可能并没有补全也就是说01:01:01.001也可能表示为1:1:1.1输入描述第一行输入一个整数n表示日志条数1<=n<=100000接下来n行输入n个时间输出描述按时间升序排序之后的时间如果有两个时间表示的时间相同则保持输入顺序示例:输入:201:41:8.91:1:09.211输出1:1:09.21101:41:8.9示例输入323:41:08.0231:1:09.21108:01:22.0输出1:1:09.21108:01:22.023:41:08.023示例输入222:41:08.02322:41:08.23输出22:41:08.02322:41:08.23时间相同保持输入顺序
// 时间排序public static void test078() {Scanner sc = new Scanner(System.in);// 输入的个数int len = Integer.parseInt(sc.nextLine());List<String> list = new ArrayList<>();int i = 0;while (i < len) {list.add(sc.nextLine());i++;}sc.close();// 对集合进行排序 a1与a2比较,结果大于0互换位置 小于等于0不变list.stream().sorted((a1, a2) -> {// 根据规则切分出时 分 秒 毫秒String[] time1 = a1.split(":");String[] time2 = a2.split(":");// 用.进行分割时需要用到转义字符 \\String[] s_n1 = time1[2].split("\\.");String[] s_n2 = time2[2].split("\\.");int h1 = Integer.parseInt(time1[0]);int h2 = Integer.parseInt(time2[0]);int m1 = Integer.parseInt(time1[1]);int m2 = Integer.parseInt(time2[1]);int s1 = Integer.parseInt(s_n1[0]);int s2 = Integer.parseInt(s_n2[0]);int n1 = Integer.parseInt(s_n1[1]);int n2 = Integer.parseInt(s_n2[1]);// 小时不相等比较小时if (h1 != h2) {return h1 - h2;}// 分钟不相等比较分钟if (m1 != m2) {return m1 - m2;}// 秒不相等比较秒if (s1 != s2) {return s1 - s2;}// 毫秒不相等比较毫秒if (n1 != n2) {return n1 - n2;}// 都相等按原来顺序return 0;}).forEach((a) -> {System.out.println(a);});}
更多华为od机试题请点这里<华为od机试题2 真题>,每篇8题,有更多的题也请告诉我啊
华为od机试题1 真题相关推荐
- 华为od机试题4 真题
华为od机试题 真题 58.处理所有作业总时长 53.最大停车距离 52.磁盘容量排序 51.非严格递增连续数字序列长度 50.均分糖果 48.没有相同字符的元素长度乘积的最大值 47. 相对开音节结 ...
- 华为od机试题6 真题
华为od机试题 真题 35.输出满足条件的数对 34.寻找众数中的中位数 33.分配内存 32.窗口和的最大值 31.求整数的连续自然数之和的表达式 30.矩阵的最大值 以下题目附带Java解法,是我 ...
- 华为od机试题8 真题
华为od机试题 真题 10.输出最多类型的个数 11.树根节点到最小的叶子节点的路径 12.货车最大载货量 13.太阳能板最大面积 14.单词接龙 17.输出连续出现次数第k多的字母的次数 18.喊7 ...
- 华为od机试题2 真题
华为od机试题 真题 77.满足最大消费额度 76.小朋友身高位置 75.字符连续出现最大次数 74.最少停车数 73.字母多条件排序 71. 交叉排序 70.水仙花数 69.消除相邻且相同字母 以下 ...
- 华为od机试题9 真题
华为od机试题 真题 9.寻找重复字符 7.字符串翻转 6.小朋友身高排序 5.CPU最少执行时间 4.猴子爬山 3.输出信元的值 2.指定元素对最小和 1.勾股数元组 以下题目附带Java解法,是我 ...
- 【java华为机试】华为od机试题考试真题
前言综述: 本次od机试考试一共三道题,第一道题和第二道题各100分,第三道题200分.本次考试的答案都是2.5h考试的时候写的,代码写的也许并不好.在考试中还是蛮紧张的,所以写代码的时候注重的是完成 ...
- 华为OD机试-2023真题-考点分类
[华为OD机试]真题列表 2023Q1 !! 点这里!! [华为OD机试]2023机考真题 !! 点这里!! 从2022年11月以后,OD机试换了新题库,也就是本专栏的所有题目,新题库考察的算法比较 ...
- 【华为OD机试/笔试真题 python】出错的或电路
题目描述 [出错的或电路] 某生产门电路的厂商发现某一批次的或门电路不稳定,具体现象为计算两个二进制数的或操作时,第一个二进制数中某两个比特位会出现交换, 交换的比特位置是随机的,但只交换这两个位,其 ...
- 华为OD机试题(AB卷)真题抽中记录文档(更新到 6 月 21 日)
文章目录 本篇博客的价值 华为 OD 机试题 ⭐ ⭐ 华为 OD 机试 6 月 20 日 抽中卷 第一套 OD 机试卷 华为 OD 机试 6 月 19 日 抽中卷 第一套 OD 机试卷 华为 OD 机 ...
最新文章
- DeepMind激起千层浪的这篇论文,并非无所不能
- Jquery性能优化(转自蓝色理想)
- React开发(263):react中处理时间的判断
- JavaSE基础chapter1Homework
- oracle导数据不释放内存,关于ORACLE数据库delete后释放空间问题
- 市监总局对橙心优选等五家社区团购不正当价格行为作出行政处罚
- vue 中 computed 计算属性 的用法
- ps2019布尔运算快捷键_设计师不会告诉你的ps布尔运算,你学会了吗?
- Android空调遥控器代码,空调代码—万能遥控器要如何正确设置空调代码?
- python官方中文库_新鲜出炉!Python 3.9 官方中文文档详解!
- linux用在炫龙m7,NH55 炫龙M7 Ubuntu 安装
- 股票 - - 常用指标【上】
- LED驱动芯片PT4115
- 基于AT91SAM9G20构建嵌入式Linux系统
- 什么是熵,信息熵以及粗糙熵
- Elasticsearc倒排索引(二):分析analysis
- 织梦插件-织梦插件大全-免费织梦插件大全
- IDEA启动连接不上数据库,但navicat却可以问题
- Mybatis 子查询
- H5+vant 电话通讯录 安卓融云功能