华为校园招聘java机试整理
来源:互联网 发布:开店宝软件 编辑:程序博客网 时间:2024/05/09 21:03
- 华为校园招聘java机试题整理
- 题1
- 题2
- 题3
- 题4
- 题5
- 题6
- 题7
- 总结一下
- 华为校园招聘java机试题整理
华为校园招聘java机试题整理
这两周又在赶项目。我就一直在思考,你说建筑项目,像盖个楼,都是先设计好了,再施工,没有说楼盖一半了,要求加个房间的吧。这软件项目,不管你盖到第几层,想加就加,想拆就拆,跟搞机械的甲方沟通,真是不太好沟。
事实证明,掌握好设计原则,用好设计模式,对防范需求变化还是很有用的。
说正题,这几天西安华为要开始校园招聘,加了华为的招聘群,也很是热闹。周日没事了,在网上找了几道java的机试题,做完分享一下,有问题的地方也请指正。
题1
如描述,不知道能不能用stack,就傻傻的自己写了一个。就是比较前后括号是否按规则成对出现。
/** * 检查输入字符串中括号是否匹配 * @author liu * */ public class Test01 { public static void main(String[] args) { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); try { char[] clist= br.readLine().trim().toCharArray(); Stack stack = new Stack(); for(int i = 0; i < clist.length; i++) { if (clist[i] == '(' || clist[i] == '[') { stack.add(clist[i]); } else if (clist[i] == ')') { if (stack.get() != '(') { System.out.println("0"); return; } } else if (clist[i] == ']') { if (stack.get() != '[') { System.out.println("0"); return; } } } if (stack.isEmpty()) { System.out.println("1"); } else { System.out.println("0"); } } catch (IOException e) { e.printStackTrace(); } } } class Stack { List<Character> list = new ArrayList<Character>(); public void add(char c) { list.add(c); } public char get() { char c = list.get(list.size() - 1); list.remove(list.size() - 1); return c; } public boolean isEmpty() { return list.isEmpty(); } public void show() { for(Character character : list) { System.out.println(character); } } }
题2
/** * 第一题,输入字符串长度len1,字符串s1,字符串长度len2,字符串s2。 * 从后向前比较,以最短字符串为标准,输出不同的元素的个数。 * 例如: 输入:s1="1,3,5" len1=3 s2="2,4,1,7,5" len2=5 * 输出:2 * 函数原型 * public int getDiffNum(int len1, String s1, int len2, String s2) * @author liu * */ public class Test02 { public static void main(String[] args) { Test02 test = new Test02(); System.out.println(test.getDiffNum(3, "1,3,5", 5, "2,4,1,7,5")); } public int getDiffNum(int len1, String s1, int len2, String s2) { int num = 0; int[] array1 = getArray(s1, len1); int[] array2 = getArray(s2, len2); int k = len1 > len2 ? len2 : len1; for (int i = 0; i < k; i++) { if (array1[i] == array2[i]) { num+=1; } } return num; } private int[] getArray(String str, int len) { String[] array = new String[len]; int[] intArray = new int[len]; array = str.split(","); for (int i = 0; i < len; i++) { intArray[len - i - 1] = Integer.valueOf(array[i]); } return intArray; } }
题3
就是表达式求值,如果熟悉逆波兰表达式,可以直接把中序表达式转换为后序表达式来做。但是不常用的肯定不会很熟悉,这个题要求又比较简单,没有括号,所以用双栈对倒的方法,思路比较简单。
就像我们人脑计算表达式一样,第一遍把乘除法算完,第二遍再算加减法。
/** * 第三题,输入一个表达式,没有括号,数字小于0-9之间,输出计算结果, * 所有的中间结果化为整形。 * 例如: 输入:3+8×2/9-2 * 输出:2 * 函数原型 * public int getMyRet(String str) * @author liu * */ public class Test03 { public static void main(String[] args) { String str = "3+8*2/9-2"; // 382*9/+2- Test03 test = new Test03(); System.out.println(test.getMyRet(str)); } public int getMyRet(String str) { int temp = 0; Stack<String> left = new Stack<String>(); Stack<String> right = new Stack<String>(); char[] c = str.toCharArray(); for (int i = c.length - 1; i >= 0; i--) { right.add(String.valueOf(c[i])); } while(!right.isEmpty()) { if (isNum(right.peek())) { left.add(right.pop()); } else if (right.peek().equals("*")) { right.pop(); temp = Integer.valueOf(left.pop()) * Integer.valueOf(right.pop()); left.add(String.valueOf(temp)); } else if (right.peek().equals("/")) { right.pop(); temp = Integer.valueOf(left.pop()) / Integer.valueOf(right.pop()); left.add(String.valueOf(temp)); } else { left.add(right.pop()); } } while(!left.isEmpty()) { right.add(left.pop()); } while(!right.isEmpty()) { if (isNum(right.peek())) { left.add(right.pop()); } else if (right.peek().equals("+")) { right.pop(); temp = Integer.valueOf(left.pop()) + Integer.valueOf(right.pop()); left.add(String.valueOf(temp)); } else if (right.peek().equals("-")) { right.pop(); temp = Integer.valueOf(left.pop()) - Integer.valueOf(right.pop()); left.add(String.valueOf(temp)); } } return Integer.valueOf(left.pop()); } private boolean isNum(String s) { return s.matches("[0-9]+"); } }
题4
/** * 1、选秀节目打分,分为专家评委和大众评委,score[] 数组里面存储每个评委打 * 的分数,judge_type[] 里存储与 score[] 数组 * 对应的评委类别,judge_type[i] == 1,表示专家评委,judge_type[i] == 2, * 表示大众评委,n表示评委总数。打分规则如下: * 专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家 * 评委平均分 * 0.6 + 大众评委 * 0.4,总分取整。 * 如果没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。 * @author liu * */ public class Test04 { public static void main(String[] args) { int[] score = {20,30,40,50,60}; int[] judge_type = {1,1,1,2,2}; int n = 5; System.out.println(new Test04().judge(score, judge_type, n)); } public int judge(int[] score, int[] judge_type, int n) { int average = 0; int expertScore = 0; int expertNum = 0; int publicScore = 0; int publicNum = 0; for (int i = 0; i < score.length; i++) { if (judge_type[i] == 1) { expertScore += score[i]; expertNum += 1; } else if (judge_type[i] == 2) { publicScore += score[i]; publicNum += 1; } } if (publicNum == 0) { average = expertScore / expertNum; } else { average = (int) (expertScore / expertNum * 0.6 + publicScore / publicNum * 0.4); } return average; } }
题5
先排个序,然后先处理中间位置,再处理两边普通位置,最后处理最两边特殊位置。
/** * 2、给定一个数组input[] ,如果数组长度n为奇数,则将数组中最大的元素放到 * output[] 数组最中间的位置,如果数组长度n为偶数, * 则将数组中最大的元素放到 output[] 数组中间两个位置偏右的那个位置上, * 然后再按从大到小的顺序,依次在第一个位置的两边,按照一 * 左一右的顺序,依次存放剩下的数。例如:input[] = {3, 6, 1, 9, 7} * output[] = {3, 7, 9, 6, 1}; * input[] = {3, 6, 1, 9, 7, 8} output[] = {1, 6, 8, 9, 7, 3} * 函数接口 void sort(int input[], int n, int output[]) * @author liu * */ public class Test05 { public static void main(String[] args) { //int n = 5; //int input[] = {3, 6, 1, 9, 7}; int n = 6; int input[] = {3,6,1,9,7,8}; int output[] = new int[n]; new Test05().sort(input, n, output); for (int i = 0 ; i < output.length; i++) { System.out.println(output[i]); } } public void sort(int input[], int n, int output[]) { bubbleSort(input); int k = n/2; output[k] = input[0]; for (int i = 1; i < (n-1)/2 + 1; i++) { output[k - i] = input[2*i - 1]; output[k + i] = input[2*i]; } if (n%2 == 0) { output[0] = input[n - 1]; } } private void bubbleSort(int[] array) { for (int i = 1; i < array.length; i++) { for (int k = 0; k < array.length - 1; k++) { if (array[k] < array[k + 1]) { int temp = array[k]; array[k] = array[k + 1]; array[k + 1] = temp; } } } } }
题6
首先对任务分级进行排序,排序过程中要记录每个任务原来对应的位置。在分别按顺序加到相应的队列中。
/** * 3、操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中, * 系统任务的优先级 < 50,用户任务的优先级 >= 50且 <= 255。 * 优先级大于255的为非法任务,应予以剔除。现有一任务队列task[],长度为n, * task中的元素值表示任务的优先级,数值越小,优先级越高。 * 函数scheduler实现如下功能,将task[] 中的任务按照系统任务、用户任务依次 * 存放到 system_task[] 数组和 user_task[] 数组中 * (数组中元素的值是任务在task[] 数组中的下标),并且优先级高的任务排在 * 前面,优先级相同的任务按照入队顺序排列(即先入队的任务排在 * 前面),数组元素为-1表示结束。例如:task[] = {0, 30, 155, 1, 80, * 300, 170, 40, 99} * system_task[] = {0, 3, 1, 7, -1} * user_task[] = {4, 8, 2, 6, -1} * * 函数接口 * void scheduler(int task[], int n, int system_task[], int user_task[]) * @author liu * */ public class Test06 { public static void main(String[] args) { int task[] = {0, 30, 155, 1, 80, 300, 170, 40, 99}; int system_task[] = new int[5]; int user_task[] = new int[5]; int n = 9; new Test06().scheduler(task, n, system_task, user_task); for (int i : system_task) { System.out.println(i); } for (int i : user_task) { System.out.println(i); } } void scheduler(int task[], int n, int system_task[], int user_task[]) { int[] index = sort(task); int s = 0; int u = 0; for (int i = 0; i < task.length; i++) { if (task[i] < 50) { system_task[s++] = index[i]; } else if (task[i] <= 255) { user_task[u++] = index[i]; } } system_task[s] = -1; user_task[u] = -1; } private int[] sort(int task[]) { int[] num = new int[task.length]; for (int i = 0; i < num.length; i++) { num[i] = i; } for (int i = 1; i < task.length; i++) { for (int k = 0; k < task.length - i; k++) { if (task[k] > task[k + 1]) { int temp = task[k]; task[k] = task[k + 1]; task[k + 1] = temp; temp = num[k]; num[k] = num[k + 1]; num[k + 1] = temp; } } } return num; } }
题7
这应该是一道C语言的题,用java属于偷懒了。题很长,其实就是字符串验证。要用C做,还真的得一种情况一种情况的验,用java可以简单的引用正则表达式,这就无敌了。
/** * 问题描述: * 我国大陆运营商的手机号码标准格式为:国家码+手机号码, * 例如:8613912345678。特点如下: * 1、 长度13位; * 2、 以86的国家码打头; * 3、 手机号码的每一位都是数字。 * 请实现手机号码合法性判断的函数(注:考生无需关注手机号码的真实性, * 也就是说诸如86123123456789这样的手机号码,我们也认为是合法的), * 要求: * 1) 如果手机号码合法,返回0; * 2) 如果手机号码长度不合法,返回1 * 3) 如果手机号码中包含非数字的字符,返回2; * 4) 如果手机号码不是以86打头的,返回3; * 【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说, * 如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。 * 要求实现函数: * int s int verifyMsisdn(char* inMsisdn) * 【输入】 char* inMsisdn,表示输入的手机号码字符串。 * 【输出】 无 * 【返回】 判断的结果,类型为int。 * 示例 * 输入: inMsisdn = “869123456789“ * 输出: 无 * 返回: 1 * 输入: inMsisdn = “8813912345678“ * 输出: 无 * 返回: 3 * 输入: inMsisdn = “8613912345678“ * 输出: 无 * 返回: 0 * @author liu * */ public class Test07 { public static void main(String[] args) { String inMsisdn = "8813912345678"; System.out.println(new Test07().verifyMsisdn(inMsisdn)); } public int verifyMsisdn(String inMsisdn) { if (13 != inMsisdn.length()) { return 1; } else if (!inMsisdn.matches("[0-9]*")) { return 2; } else if (!inMsisdn.startsWith("86")) { return 3; } return 0; } }
总结一下
代码在我的github仓库中。
总结一下,主要都是对字符、字符串、数组的基本应用的考察。要灵活地应用字符串和数组,会简单的排序,就基本可以解决问题。
还有就是大家一定会发现题目的难度其实是不一样的,有一道基础,一道中级,一道高级三道题组成一套题。
题目来自yuan22003的专栏,表示感谢。
0 0
- 华为校园招聘java机试整理
- 华为校园招聘Java机试题
- 2014华为校园招聘机试
- 华为2014校园招聘机试
- 华为机试 2014校园招聘
- 华为2014校园招聘合肥机试
- 华为2014校园招聘机试3
- 2015华为校园招聘 机试总结
- 华为2015校园招聘机试
- 华为校园招聘机试题
- 2015届华为校园招聘机试题 java实现
- 2015届华为校园招聘机试题 java实现(2)
- 2015届华为校园招聘机试题 (3)java实现
- 2015届华为校园招聘机试题 (java实现)
- 2014届华为校园招聘机试题(java实现)
- 2012届华为校园招聘机试题(java实现)
- 2012华为校园招聘机试(成都)-1
- 2012华为校园招聘机试(成都)-2
- codeforce 493B. Vasya and Wrestling(多重条件比较)
- 编译原理大作业(用java编写小型GCC 编译器)
- SQL查询语句(一)
- 能确定队伍顺序吗
- Valid Palindrome
- 华为校园招聘java机试整理
- SQL查询语句(二)
- Java基础(五)
- 加权准确率、目标函数、算法收敛问题
- Horizon支持多domain设置
- ssh+lcx实现Metasploit测试机没有公网IP时候的公网端口映射
- 如何理解似然函数???
- 2.由登陆开始
- Leetcode|Merge Sorted Array