原标题:想去面试?这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 = dic.get(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%。这道题目考察的是归并排序的基本思想。注意,这两个数组是有序的呢,你怎么可以无视这么有利的条件直接拼接上两个数组开始冒泡了???

参考代码:

defmerge_sorted_array(a,b):

c = []

i,j = 0, 0

whileTrue:

ifi==len(a):

c.extend(b[j:])

return(c)

elifj==len(b):

c.extend(a[i:])

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”。

题目难度:困难。

出现概率:约10%。这是一道动态规划+哈希查找的综合应用题。这道题能做出来,你的代码功底很可以啊。对了,你的期望薪资是多少?

参考代码:

deflongest_substr(s):

dic = {}

start,maxlen,substr = 0, 0, ""

fori,x inenumerate(s):

ifx indic:

start = max(dic[x]+ 1,start)

dic[x] = i

else:

dic[x] = i

ifi-start+ 1>maxlen:

maxlen = i-start+ 1

substr = s[start:i+ 1]

return(substr)

print(longest_substr( "abcbefgf"))

print(longest_substr( "abcdef"))

print(longest_substr( "abbcddefh"))

输出结果:

cbefg

abcdef

defh

9,全排列

题目形式:给定一个数组,找出其所有可能的排列。例如: arr = [1,1,3],输出为 [[1,1,3],[1,3,1],[3,1,1]]。

题目难度:中等

出现概率:约10%。这是一道动态规划+排列组合的综合应用题。同学,你这里用递归的话你的这个时间复杂度得有多少?我们这个数组一旦有几十个元素的话,你这还能跑得动吗?

参考代码:

importnumpy asnp

defpermutations(arr):

iflen(arr)<= 1:

return([arr])

t = [arr[ 0: 1]]

i = 1

whilei<=len(arr) -1:

a = arr[i]

t = [xs[ 0:j]+[a]+xs[j:] forxs int forj inrange(i+ 1)]

t = np.unique(t,axis= 0).tolist

i = i+ 1

return(t)

print(permutations([ 1, 1, 3]))

输出结果:

[[1, 1, 3], [1, 3, 1], [3, 1, 1]]

10,三数之和

题目形式:给定一个数组和目标数target,找出数组中a,b,c满足 a+b+c = target 的所有组合。例如:arr = [-3,-1,-2,1,2,3],target = 0。输出为 [(-3,1,2),(-2,-1,3)]

题目难度:困难

出现概率:约5%。这是一道非常有技巧的题目。你可以尝试先将arr排序。注意,我们的时间复杂度要求为O(n**2) ,空间复杂度要求O(1),对,就是这么严格,你要好好想想……哟,有思路啦……emmm……大体上符合要求……同学,你现在手上还有其他家的offer吗?

参考代码:

defsum_of_three(arr,target):

assertlen(arr)>= 3, "len(arr) should >=3!"

arr.sort

ans = set

fork,c inenumerate(arr):

i,j = k+ 1,len(arr) -1

whilei

ifarr[i]+arr[j]+c

i = i+ 1

elifarr[i]+arr[j]+c > target:

j = j -1

else:

ans.update({(arr[k],arr[i],arr[j])})

i = i+ 1

j = j -1

return(list(ans))

print(sum_of_three([ -3, -1, -2, 1, 2, 3], 0))

[(-2, -1, 3), (-3, 1, 2)]

责任编辑:

华为手撕代码c语言题目,想去面试?这10道最高频的手撕代码题都会了吗?相关推荐

  1. 不想去面试了,需要主动联系HR吗?

    日前小J接到一家公司的电话面试邀约,当小J上网了解了这家公司的情况后,觉得该职位不适合自己,不想浪费时间去面试,但当时电话中又答应去,小J觉得自己已经答应了对方,再反悔说不去,很不好意思. 7成网友认 ...

  2. 京东秋招java面试_最新秋招,京东技术中台Java开发面经,有想去面试的可以来看下...

    京东技术中台Java开发 image.png (面试题+答案+资料领取方式:关注公众号:程序员白楠楠) title: 京东技术中台秋招面试 希望自己别再干蠢事了 把昨天上午的快手面试给忘了,一觉睡过去 ...

  3. C语言 请给小学生随机出10道加减法的练习题,要求:10以内的加减法,并且能批改。

    //学习记录 #include<stdio.h> #include<time.h> #include<math.h> #include<stdlib.h> ...

  4. od机考题目-免单统计-第10讲:高频真题解析 III(上)

    while 1:try:size = int(input())order_time = [input() for _

  5. 华为机试字符串分割c语言,2014年华为上机机试c语言标题和答案

    2014年华为上机机试c语言题目和答案 自己code出来的,结果是正确的,但是其中还有很多的优化之处,还请各位大神多多指导. 代码打包: http://download.csdn.net/detail ...

  6. 【面试】嵌入式C语言题目整理

    [面试]嵌入式C语言题目整理 描述内存四区. 内存四区分为:代码区.静态区.堆区.栈区 代码区就是用来存放代码的. 静态区用来存放全局变量.静态变量.常量(字符串常量.const修饰的全局变量). 堆 ...

  7. 零代码平台-iwx,是想革我们程序员命?

    0代码编程和当前比较流行的前端框架React,谷歌的Go语言,Node这些最新技术关系很大,持续分享一下. 最近一些年互联网发展迅猛,应用从简单架构向复杂架构发展,架构变向复杂之后相应的环境.平台等管 ...

  8. 机器学习实用代码汇总(你想要的这里都有)

    机器学习实用代码汇总(你想要的这里都有) 文章目录 机器学习实用代码汇总(你想要的这里都有) 前言 一.数据导入 1.数据文件读取 2.提取特征和标签 3.数据分布及关系图(ProfileReport ...

  9. 关于面试时碰到的几个多线程手撕代码题

    总结秋招和实习面试的时候碰到的几个手撕的多线程代码题: 问题一:三个线程循环打印ABC,线程一打印A,线程二打印B,线程三打印C,打印10遍即可.这个问题主要是考察怎么使用线程同步的问题,通常情况下我 ...

最新文章

  1. python文字教程-Python 爬虫零基础教程(3):输出一个网页上的文字
  2. 源路由 就是指定数据传输经过这个路由服务器
  3. 数据结构与算法,每日一道
  4. iscsi-分区类型
  5. adminer.php下载,Adminer.php
  6. 昇腾AI处理器软件栈--运行管理器(Runtime)
  7. 光头老熊做易赛是这样做教下家的
  8. 【MATLAB】(一)基本使用入门
  9. 功能强大的相片管理软件ACDSee Photo Manager 12.0.342注册码序列号中文版
  10. 麻省理工18年春软件构造课程阅读02“Java基础”
  11. 关于利用Windows权限屏蔽Win10易升
  12. 装配uwsgi和nginx rabbitMQ
  13. 我走进了微缩的“物联国”
  14. 微信小程序地图实现标记多个位置
  15. 英语语法:词法之动词不定式
  16. 微软Windows8“消失”了的宣传壁纸
  17. 数据库关系代数之除运算
  18. 公历转农历matlab,公历转农历
  19. 常见测试用例设计之键盘
  20. php 做一个题目木选项,GRE PPII阅读解析版

热门文章

  1. 3分钟用C语言教你写个‘浪漫烟花‘---特别漂亮
  2. 手游服务器如何修改d盘,把steam上的游戏从d盘改到c盘的方法 | 手游网游页游攻略大全...
  3. 每个人不起舞的日子,都是对生命的辜负~
  4. 修改 oracle 字符 zhs,修改Oracle数据库的字符集(UTF8→ZHS16GBK)
  5. 2014去哪儿网几道题
  6. 华北电力大学计算机科学,华北电力大学计算机科学与技术系介绍
  7. 艰难时世的赚钱之道:淘金iPhone App (一)
  8. 民非企业盈利怎么处理_​民办非企业利息收入如何处理
  9. 计算机视觉基础入门(2)
  10. 细粒度分类之NTS_NET解读