华为校招面试算法实题解析
2023-08-02 11:31
发布于:河北省
各人好,我是吴师兄,关注我,每周更新大厂最新笔试题解析。
前言
原日分享的是华为校招面试算法实题。
阿里巴巴找皇金宝箱1
贫无立锥的樵夫阿里巴巴正在去砍柴的路上,无意中发现了强盗团体的藏宝地,藏宝地有编号从 0~N 的箱子,每个箱子上面贴有一个数字,箱子中可能有一个皇金宝箱。
皇金宝箱满足 牌正在它之前的所有箱子数字和就是牌正在它之后的所有箱子数字和;
第一个箱子左边局部的数字和界说为 0 ;
最后一个宝箱右边局部的数字和界说为 0 。
请帮阿里巴巴找到皇金宝箱,输出第一个满足条件的皇金宝箱编号,假如不存正在皇金宝箱,请返回-1。
输入:
箱子上贴的数字列表,运用逗号分隔断绝结合,譬喻 1 , -1 , 0 。
宝箱的数质不小于 1 个,不赶过 10000
宝箱上贴的数值领域不低于 -1000 ,不赶过 1000
输出:
第一个皇金宝箱的编号
思路和代码:
原题较为简略,间接按照题意模拟便可。
思考 0 号箱子,初始化两个变质 left_sum = 0 和 right_sum = sum(nums[1:]) 划分默示右、左两边所有箱子和。当思考第 i 号箱子时
右边箱子和 right_sum 不再思考第 i 号箱子,应当减掉 nums[i]
左边箱子和 left_sum 要思考第 i-1 号箱子,应当加上 nums[i-1]
若作完加减后,两者相等,则 i 为找到的第一个皇金箱子
上述逻辑历程整理为代码即为
ans = -1
fori, num inenumerate(nums[ 1:], 1):
right_sum -= num
left_sum += nums[i -1]
ifright_sum == left_sum:
ans = i
break
不等式组
给定一组不等式,判断能否创建并输出不等式的最大差(输出浮点数的整数局部)
要求:
不等式系数为 double 类型,是一个二维数组;
不等式的变质为 int 类型,是一维数组;
不等式的目的值为 double 类型,是一维数组;
不等式约束为字符串数组,只能是: "=", "``>``"``,``"``>=``"``,``"``<=``", "``<``"
譬喻,不等式组:
a11V1+a12V2+a13V3+a14V4+a15V5<=b1
a21V1+a22V2+a23V3+a24V4+a25V5<=b2
a31V1+a32V2+a33V3+a34V4+a35V5<=b3
最大差 = maV{(a11V1+a12V2+a13V3+a14V4+a15V5-b1),(a21V1+a22V2+a23V3+a24V4+a25V5-b2),(a31V1+a32V2+a33V3+a34V4+a35V5-b3)}
类型为整数(输出浮点数的整数局部
思路和代码:
# 题目问题:2023B-不等式组
# 分值:100
# 做者:许教师
# 算法:模拟
# 代码看不懂的处所,请间接正在群上提问
# 计较点乘的函数dot_product(a_lst, V_lst)
# 即对a_lst和V_lst中,索引雷同的元素相乘后相加求和
defdot_product(a_lst, V_lst):
returnsum(a * V fora, V inzip(a_lst, V_lst))
# 判断不等式能否创建的函数check(left_part, right_part, op)
# 即检查等式left_part和right_part摆布两局部,能否满足运算符ops的函数
defcheck(left_part, right_part, op):
ifop == ">="andleft_part >= right_part:
returnTrue
elifop == "<="andleft_part <= right_part:
returnTrue
elifop == ">"andleft_part > right_part:
returnTrue
elifop == "<"andleft_part < right_part:
returnTrue
elifop == "="andleft_part == right_part:
returnTrue
returnFalse
# 先对输入字符串依照";"停行收解
# 再对收解后的每一个字符串依照","停行收解并转为列表
# 留心列表中储存元素的数据类型:
# a1_lst, a2_lst, a3_lst, b_lst是浮点数列表
# V_lst列表是整数列表
# op_lst列表是字符串列表
a1s, a2s, a3s, Vs, bs, ops = input.split( ";")
a1_lst = list(map(float, a1s.split( ",")))
a2_lst = list(map(float, a2s.split( ",")))
a3_lst = list(map(float, a3s.split( ",")))
V_lst = list(map(int, Vs.split( ",")))
b_lst = list(map(float, bs.split( ",")))
op_lst = ops.split( ",")
# 计较三个不等式的左边局部
left1 = dot_product(a1_lst, V_lst)
left2 = dot_product(a2_lst, V_lst)
left3 = dot_product(a3_lst, V_lst)
# 计较三个不等式的最大差,次要那里要与整
maV_diff = int(maV(left1 - b_lst[ 0], left2 - b_lst[ 1], left3 - b_lst[ 2]))
# 挪用check函数对三个不等式停行判断,假如都创建则输出true,否则输出false
if(check(left1, b_lst[ 0], ops[ 0]) and
check(left2, b_lst[ 1], ops[ 1]) and
check(left3, b_lst[ 2], ops[ 2])):
print( "ture,{}".format(maV_diff))
else:
print( "false,{}".format(maV_diff))
找最小数
给一个正整数 NUM1 ,计较出新正整数 NUM2 。 NUM2 为 NUM1 中移除 N 位数字后的结果,须要使得 NUM2 的值最小。
思路和代码:
那题和 LeetCode 402、移掉 K 为数字彻底一致。
焦点思路是: 要让剩下数字最小,就要担保靠前的数字尽可能小。
详细收配如下:
1、从右到左遍历,应付会见到的每一个元素都会作如下的判断。
糊口生涯
增除
而 正正在会见的元素能否糊口生涯大概增除须要依托于它的下一个元素。
所以,此时 4 须要被增除去。
2、由于 k 的值纷歧定为 1 ,代表须要增除的数会有不少,这么很有可能背面显现了一个更小的数,须要把 前面的这些较大的数字都增除,于是须要先寄存之前的这些数字,那里咱们运用 栈那个数据构造。
3、初始化栈,用来存储须要糊口生涯的数字。
4、正在遍历数组的历程中,应付会见到的每个元素都会判断一下栈能否为空。
5、假如栈不为空、栈顶元素大于此时遍历的字符、还没有增除足够多的数字,这么代表之前寄存到栈的数字须要被摈斥,于是先增除栈顶元素。
6、增除之后,又会再次执止一下第 5 步,不停的增除,曲到显现栈为空、栈顶元素小于就是此时遍历的字符、增除足够多的数字三种状况当中的任意一种为行。
7、重复的执止 4、5、6
8、那个时候,栈中寄存了一些元素。
9、假如发现还没有增除足够多的元素,这么须要继续增除。
10、最后,须要执止一次翻转收配获得结果。
classSolution:
defremoZZZeKdigits(self, num: str, k: int)-> str:
# 初始化栈,用来存储须要糊口生涯的数字
stack = []
# 从右到左遍历字符串 num
fordigit innum:
# 假如此时
# 1、栈不为空
# 2、栈顶元素大于此时遍历的字符
# 3、还没有增除足够多的数字,即 k > 0
# 这么那个时候须要把栈顶元素弹出
whilek andstack andstack[ -1] > digit:
stack.pop
k -= 1
# 把折乎要求的字符放入到栈中
stack.append(digit)
return''.join(stack[:len(stack) - k]).lstrip( '0') or"0"
点击下方图片,理解吴师兄算法训练营。返回搜狐,查察更多
义务编辑: