华为⼿撕代码c语⾔题⽬,想去⾯试?这10道最⾼频的⼿撕代码
题都会了吗?
原标题:想去⾯试?这10道最⾼频的⼿撕代码题都会了吗?
来源:Python与算法之美
ID:Python_Ai_Road
作者:梁云1991
想去看机会?下⾯这10道最⾼频的⼿撕代码⾯试题都会了吗?
相信我,彻底掌握以下这10道题的解法,你顺利做出⼿撕代码⾯试题⽬的概率⾄少不低于50%。
1,快速排序
题⽬形式:⼿写⼀下快速排序算法。
题⽬难度:中等。
出现概率:约50%。⼿写快排绝对是⼿撕代码⾯试题中的百兽之王,掌握了它就是送分题,没有掌握它就是送命题。
参考代码:
defquick_sort(arr,start=0,end=None):
ifend isNone:
end = len(arr) -1
ifend<=start:
return(arr)
i,j = start,end
ref = arr[start]
whilej>i:
ifarr[j]>= ref:
j = j - 1
else:
# 此处使⽤⼀⾏语句交换3个元素的值
arr[i],arr[j ],arr[i+1] = arr[j],arr[i+1],arr[i ]
i = i + 1
quick_sort(arr,start=start,end = i -1)
quick_sort(arr,start=i+ 1,end = end)
return(arr)
print(quick_sort([ 1, 1, 3, 3, 2, 2, 6, 6, 6, 5, 5, 7]))
输出结果:
[1, 1, 2, 2, 2, 3, 5, 5, 6, 6, 6, 7]
2,⼆分查
题⽬形式:⼿写⼀下⼆分查算法。给定⼀个有序数组 arr 和⼀个⽬标元素 target ,返回该 target 在 arr 中的索引,若不存在,返回-1。
题⽬难度:简单。
出现概率:约30%。⼆分查绝对是⼿写代码题中的百兽之后,没有妃⼦可以和她争宠。连个⼆分查都写不出来,还来应聘程序员,你是不是对程序员这个职业有什么误解?
参考代码:
defbinary_search(arr,target):
start,end = 0,len(arr) -1
whileTrue:
ifend - start <= 1:
iftarget == arr[start]:
return(start)
eliftarget == arr[end]:
return(end)
else:
return( -1)
mid = (start + end)// 2
ifarr[mid]>=target:
end = mid
else:
start = mid
print(binary_search([ 1, 4, 7, 8, 9, 12], 9))
print(binary_search([ 1, 4, 7, 8, 9, 12], 3))
输出结果:
4
-1
3,爬楼梯
题⽬形式:有⼀个楼梯,总共有10级台阶,每次只能⾛⼀级或者两级台阶,全部⾛完,有多少种⾛法?
题⽬难度:简单。
出现概率:约20%。爬楼梯问题是⼿写代码题中的百兽之豹。爬楼梯问题可以⽤递归来解决,但是如果考虑到时间复杂度,最好⽤动态规划的思想来处理,这是⼀个动态规划算法的教科书级别的案例。连个楼梯都爬不明⽩,这个算法基础令⼈堪忧啊!
参考代码:
defclimb_stairs(n):
ifn== 1:
return1
ifn== 2:
return2
a,b = 1, 2
i = 3
whilei<=n:
a,b = b,a+b
i += 1
returnb
print(climb_stairs( 10))
输出结果:
89
4,两数之和
题⽬形式:寻列表中满⾜两数之和等于⽬标值的元素的下标。例如:arr = [2,7,4,9],target = 6 则返回 [0,2],若不存在,返回空列表[]。
题⽬难度:简单。
出现概率:约20%。两数之和是⼿写代码题中的百兽之狼。两数之和问题考察候选⼈对哈希表可以⽤空间换取时间这个特性的理解。哎呦喂,写个两数之和还整上两重循环了,你这时间复杂度是多少啊?
参考代码:
defsum_of_two(arr,target):
dic = {}
fori,x inenumerate(arr):
j = (target-x, -1)
ifj != -1:
return((j,i))
else:
dic[x] = i
return([])
arr = [ 2, 7, 4, 9]
target = 6
print(sum_of_two(arr,target))
输出结果:
(0, 2)
5,最⼤回撤
题⽬形式:有⼀个数组,求其中两个数x,y,满⾜x的索引⼩于y的索引,使得 x-y 最⼤。例如 arr = [3,7,2,6,4,1,9,8,5], 最⼤回撤是6,对应的x=7,y=1。
题⽬难度:中等。
出现概率:约20%。这道题⽬可能以买卖股票的最佳时机,或者最⼤抬升等各种形式出现,这也是⼀道动态规划的史诗级范例。呦呵,⼜整上两重循环了,这循环写的很可以啊。
参考代码:
defmax_drawdown(arr):
assertlen(arr)> 2, "len(arr) should > 2!"
x,y = arr[ 0: 2]
xmax = x
maxdiff = x-y
fori inrange( 2,len(arr)):
ifarr[i -1] > xmax:
xmax = arr[i -1]
ifxmax - arr[i] > maxdiff:
maxdiff = xmax - arr[i]
x,y = xmax,arr[i]
print( "x=",x, ",y=",y)
return(maxdiff)
print(max_drawdown([ 3, 7, 2, 6, 4, 1, 9, 8, 5]))
输出结果:
x= 7 ,y= 1
6
6,合并两个有序数组
题⽬形式:给定两个按升序排列的有序数组,将它们合并成⼀个新的有序数组。例如:a = [1,2,6,8], b = [2,4,7,10],输出为 arr =
[1,2,2,4,6,7,8,10]
题⽬难度:简单。
出现概率:约15%。这道题⽬考察的是归并排序的基本思想。注意,这两个数组是有序的呢,你怎么可以⽆视这么有利的条件直接拼接上两个数组开始冒泡了
参考代码:c语言如何去学
defmerge_sorted_array(a,b):
c = []
i,j = 0, 0
whileTrue:
ifi==len(a):
return(c)
elifj==len(b):
return(c)
else:
ifa[i]
c.append(a[i])
i=i+ 1
else:
c.append(b[j])
j=j+ 1
print(merge_sorted_array([ 1, 2, 6, 8],[ 2, 4, 7, 10]))
输出结果:
[1, 2, 2, 4, 6, 7, 8, 10]
7,最⼤连续⼦数组和
题⽬形式:给定⼀个数组,求其最⼤连续⼦数组的和。例如:arr = [1,5,-10,2,5,-3,2,6,-3,1]. 输出为:12。对应的连续⼦数组为 [2,5,-3,2,6]。
题⽬难度:中等。
出现概率:约15%。这道题⽬也是⼀道动态规划的祖传范例。同学,你的这个两重循环写的确实很6,但是我们不能认为你的这道题⽬做对了!
参考代码:
defmax_sub_array(arr):
n = len(arr)
maxi,maxall = arr[ 0],arr[ 0]
fori inrange( 1,n):
maxi = max(arr[i],maxi + arr[i])
maxall = max(maxall,maxi)
return(maxall)
print(max_sub_array([ 1, 5, -10, 2, 5, -3, 2, 6, -3, 1]))
输出结果:
12
8,最长不重复⼦串
题⽬形式:给定⼀个字符串,出没有重复字符的最长的⼦串。例如输⼊“abcbefgf”,答案是 “cbefg”。
题⽬难度:困难。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论