记录华为OD面试与机试算法题
之前吐槽过华为OD的招聘,吐槽归吐槽,也写一下面试机试经历包括遇到的算法题和一些被问到的基础问题,我情况比较特殊大家可以酌情参考,写完发现有点多,面试算法题另外发一个帖子.
由于我是转码的,没有问项目,八股文都是基础内容,倒是没难为我.
机试
网上有原题,照搬过来
1.题目描述:
为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行。
现在有一个任务数组,数组元素表示在这1s内新增的任务个数,且每秒都有新增任务。
假设GPU最多一次执行n个任务,一次执行耗时1s,在保证GPU不空闲的情况下,最少需要多长时间执行完成。
输入描述:
第一个参数为GPU最多执行的任务个数,取值范围1-10000
第二个参数为任务数组的长度,取值范围1-10000
第三个参数为任务数组,数字范围1-10000
输出描述:
执行完所有任务需要多少秒
示例
输入:
3
5
1 2 3 4 5
输出:
6
说明:
一次最多执行3个任务 最少耗时6s
输入:
4
5
5 4 1 1 1
输出:
5
说明:
一次最多执行4个任务 最少耗时5s
(easy,从第一个数往后迭代即可,记录一下每次剩余的量留给下次,最后做一次剩余的处理)
2.题目描述:
现在有一队小朋友,他们高矮不同,,我们以正整数数组表示这一队小朋友的身高,如数组{5,3,1,2,3}。
我们现在希望小朋友排队,以“高”“矮”“高”“矮”顺序排列,每一个“高”位置的小朋友要比相邻的位置高或者相等;每一个“矮”位置的小朋友要比相邻的位置矮或者相等;要求小朋友们移动的距离和最小,第一个从“高”位开始排,输出最小移动距离即可。
移动距离的定义如下所示:第二位小朋友移到第三位小朋友后面,移动距离为1,若移动到第四位小朋友后面,移动距离为2。
输入描述:
排序前的小朋友,以英文空格的正整数:4 3 5 7 8
小朋友<100个
输出描述:
排序后的小朋友,以英文空格分割的正整数:4 3 7 5 8
输出结果为最小移动距离,只有5和7交换了位置,移动距离都是1
示例:
输入:
4 1 3 5 2
输出:
4 1 5 2 3
输入:
1 1 1 1 1
输出:
1 1 1 1 1
说明:
相邻位置可以相等
输入:
xxx
输出:
[]
说明:
出现非法参数情况,返回空数组
(寄了,瞎写40%,猜应该是用某种贪心策略)
3.题目描述
积木宽高相等,长度不等,每层只能放一个或拼接多个积木,每层长度相等,求最大层数,最少2层。
输入
给定积木的长度,以空格分隔,例如:3 6 6 3。
输出
如果可以搭建,返回最大层数,如果不可以返回-1。
样例输入
3 6 6 3
样例输出
3
样例输入
3 5
样例输出
-1
(我运气好看到过这题好几次,原博文里有答案,他用的贪心策略过了,事实上应该是用例比较弱,正解得用DFS+剪枝,我当时第二题没做出来,有点烦,就用贪心策略过了,回去调第二题,正解可参考leetcode 698. 划分为k个相等的子集,比较好转化,稍作修改即可).
一二面八股文汇总
1.C和C++区别.
2.谈谈对malloc/free,new/delete的认识.
3.vector和list区别.
4.static的使用情景与作用.
5.对象的构造与析构顺序(我答的基类和派生类的构造析构顺序,他没反馈继续问,应该没跑题吧).
6.set和map,unordered_set和unordered_map的实现方式与区别(带unordered散列表,不带的是红黑树,set的key:value相同,map不同),如何评价hash函数的好坏(计算速度/key值碰撞频率?).
7.虚函数与实现方式,菱形继承的问题(数据重复)与解决方式(虚继承),虚继承如何解决问题的(讲了虚继承的内存模型,但我当时记不清楚了,我答的用指针指向具体的数据地址,应该是指针->一个虚表(叫啥名忘了),表里记录偏移量).
8.构造函数是否可重载(当然可以).
9.虚函数如何实现(指针和虚函数表),析构函数是否可重载(面完了一想无参数从语法层面就不可以,但是我脑抽了,答的不可以,但理由给错了).
10.谈谈inline---->再谈谈虚函数是否可inline(我答的不可以,因为inline编译时确定了,而虚函数是运行时动态绑定的,要实现多态,所以不可以,面试官说如果虚函数没有表现出多态是可以inline的,但一般不这么写).
11.模板编程了解么,谈谈你的认识.
12.谈谈智能指针原理(就unique/shared/weak那一套).
13.操作系统一般都是段页式内存,谈谈段页式内存的好处(我答的方便代码加载,方便空分复用,答的模糊且不全,具体可以参考操作系统,我去年看的,全忘了)
14.乐观锁和悲观锁了解么(......不了解).
15.linux了解么,用的多不(不多,只会基本的命令...).