华为OD机考心得
本人是在一个勉强一本的院校毕业的,学的也并不是计算机软件方向。因为并不太满意所学的专业的就业情况,感觉互联网行业会更加有前途,于是报了个Java的培训班学习了大概一年左右,才投递的简历。本来没想着能有大厂来找,没想着被华为给捞了。虽然OD基本算是外包的形式,但是毕竟是在华为研究所内工作,也能参与到项目的开发,最关键的是钱也能给到位,所以个人觉得算是个不错的机会。
华为OD的面试首先会有一轮机考,机考是在牛客网上做编程题。总共三道题,据说是一道简单两道中等,总分400分,150分以上就算通过。因为及格分数定的不是特别高,而且在培训期间个人也断续在牛客网和力扣上刷过题,所以感觉有机会,便答应了尝试一下。
机考语言是可以自己选的,本人只会Java所以就选的Java。机考与牛可网上的模拟考试差别不大,要开摄像头,不允许切屏(也就是没法用做题的电脑百度),然后要求用手机扫一下码,然后手机就进了一个小程序,估计离开这个小程序就算作弊了。
第一道题非常简单,求括号的最大嵌套深度。也就是会给出一个有效的带括号的字符串,比如"(1+(2*3)+((8)/4))+1",然后求括号的最大嵌套深度,这个例子里就是3。既然都是有效的字符串了,那直接for循环从左到右遍历呗,遇到左括号把答案+1,遇到右括号-1,不断更新最大值就行了。力扣上有一样的题,这里就不多描述了:
https://leetcode-cn.com/problems/maximum-nesting-depth-of-the-parentheses/
第二道题,求解连续数列,题目描述忘了,简单来说就是给一个总和,以及连续正整数的个数,然后求这几个连续正整数的值。比如说和为525,数列个数为6,那么输出应该是85,86,87,88,89,90(85+86+87+88+89+90=525)。
这道题也不算难,仔细想想就是一道数学题,假设数列的第一个数为x,那么有(x)+(x+1)+(x+2)+(x+3)+(x+4)+(x+5)=525,化简一下就是6x+(1+2+3+4+5)=525,括号里的数其实就是从1开始,差为1的等差数列,那公式就是(1+2+3+4+5)=(1+5)*5/2=15,当然不知道这个公式也没事,反正让机器遍历计算一下就完了。再根据这个思路一般化,设和为S,数列个数为n,那么有n*x+n*(n-1)/2=S,推出x=(S-n*(n-1)/2)/n(不知道等差数列的求和公式的话就是x=(S-(1+2+…+n-1))/n,其实也复杂不了太多)
第三题,数组去重和排序。简单来说就是给一个乱序的数组,比如1,3,2,3,3,2,4,4,4,5 ,先去掉所有重复数字,然后按去重前数字出现的次数从多到少排序,如果出现次数一样就按第一次出现的顺序来排序。比如上面的例子最后答案就是3,4,2,1,5。个人对这个问题的思路是可以建两个map,一个记录每个数字的出现次数,另一个记录数字第一次出现的位置,完了对去重后的数组按照这两个map的记录进行排序。其实也不算难,但是当时很紧张而且也没什么时间了,就没有写出来,最后直接返回了用例里的答案,管他呢,至少也有个几分吧。