1,快速排序

题目形式:手写一下快速排序算法。

题目难度:中等。

出现概率:约50%。手写快排绝对是手撕代码面试题中的百兽之王,掌握了它就是送分题,没有掌握它就是送命题。

参考代码:

def quick_sort(arr,start=0,end=None):
if end is None:
end = len(arr)-1
if end<=start:
return(arr)
i,j = start,end
ref = arr[start]
while j>i:
if arr[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%。二分查找绝对是手写代码题中的百兽之后,没有妃子可以和她争宠。连个二分查找都写不出来,还来应聘程序员,你是不是对程序员这个职业有什么误解?

参考代码:

nums = [1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11,
11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26,
26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40,
42, 43, 45, 45, 46, 46, 47, 47, 51, 52, 52, 53, 53,
55, 55, 56, 56, 57, 57, 57, 58, 59, 61, 62, 64, 66,
66, 67, 68, 69, 69, 71, 72, 72, 74, 74, 75, 76, 78,
78, 79, 79, 79, 79, 80, 82, 85, 88, 89, 90, 90, 91,
91, 91, 94, 99, 99]
def find(num,nums):
mid = len(nums) // 2
if nums[mid] > num:
nums = nums[0:mid]
print(nums)
find(num, nums)
elif nums[mid] < num:
nums = nums[mid+1:]
print(nums)
find(num, nums)
else:
print('找到了')
print(nums[mid])
return nums[mid]
find(40,nums)

输出结果:

  • [1, 2, 4, 5, 5, 5, 6, 6, 6, 7, 7, 7, 10, 11, 11, 11, 11, 12, 13, 13, 15, 16, 16, 20, 21, 21, 23, 24, 26, 26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47]

    [21, 23, 24, 26, 26, 27, 28, 28, 31, 33, 33, 34, 35, 38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47]

    [38, 38, 39, 40, 42, 43, 45, 45, 46, 46, 47]

    [38, 38, 39, 40, 42]

    [40, 42]

    [40]

    找到了

    40

3,爬楼梯

题目形式:有一个楼梯,总共有10级台阶,每次只能走一级或者两级台阶,全部走完,有多少种走法?

题目难度:简单。

出现概率:约20%。爬楼梯问题是手写代码题中的百兽之豹。爬楼梯问题可以用递归来解决,但是如果考虑到时间复杂度,最好用动态规划的思想来处理,这是一个动态规划算法的教科书级别的案例。连个楼梯都爬不明白,这个算法基础令人堪忧啊!

参考代码:

def climb_stairs(n):
if n==1:
return 1
if n==2:
return 2
a,b = 1,2
i = 3
while i<=n:
a,b = b,a+b
i +=1
return b print(climb_stairs(10)) ## 也就是斐波那契数组

输出结果:

89

4,两数之和

题目形式:寻找列表中满足两数之和等于目标值的元素的下标。例如:arr = [2,7,4,9],target = 6 则返回 [0,2],若不存在,返回空列表[]。

题目难度:简单。

出现概率:约20%。两数之和是手写代码题中的百兽之狼。两数之和问题考察候选人对哈希表可以用空间换取时间这个特性的理解。哎呦喂,写个两数之和还整上两重循环了,你这时间复杂度是多少啊?

参考代码:

def twoSum(self, nums: List[int], target: int) -> List[int]:
for i in range(len(nums)):
res = target - nums[i]
if res in nums and nums.index(res) != i:
return [i,nums.index(res)]

输出结果:

(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%。这道题目可能以买卖股票的最佳时机,或者最大抬升等各种形式出现,这也是一道动态规划的史诗级范例。呦呵,又整上两重循环了,这循环写的很可以啊。

参考代码:

def max_drawdown(arr):
assert len(arr)>2, "len(arr) should > 2!"
x,y = arr[0:2]
xmax = x
maxdiff = x-y for i in range(2,len(arr)):
if arr[i-1] > xmax:
xmax = arr[i-1]
if xmax - 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= 16

6,合并两个有序数组

题目形式:给定两个按升序排列的有序数组,将它们合并成一个新的有序数组。例如:a = [1,2,6,8], b = [2,4,7,10],输出为 arr = [1,2,2,4,6,7,8,10]

题目难度:简单。

出现概率:约15%。这道题目考察的是归并排序的基本思想。注意,这两个数组是有序的呢,你怎么可以无视这么有利的条件直接拼接上两个数组开始冒泡了???

参考代码:


def merge_sorted_array(a,b):
c = []
i,j = 0,0
while True:
if i==len(a):
c.extend(b[j:])
return(c)
elif j==len(b):
c.extend(a[i:])
return(c)
else:
if a[i]<b[j]:
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,但是我们不能认为你的这道题目做对了!

参考代码:


def max_sub_array(arr):
n = len(arr)
maxi,maxall = arr[0],arr[0]
for i in range(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%。这是一道动态规划+哈希查找的综合应用题。这道题能做出来,你的代码功底很可以啊。对了,你的期望薪资是多少?

参考代码:

def longest_substr(s):
dic = {}
start,maxlen,substr = 0,0,"" for i,x in enumerate(s):
if x in dic:
start = max(dic[x]+1,start)
dic[x] = i
else:
dic[x] = i if i-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"))

输出结果:

cbefgabcdefdefh

9,全排列

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

题目难度:中等

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

参考代码:

import numpy as np
def permutations(arr):
if len(arr)<=1:
return([arr])
t = [arr[0:1]]
i = 1
while i<=len(arr)-1:
a = arr[i]
t = [xs[0:j]+[a]+xs[j:] for xs in t for j in range(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吗?

参考代码:

def threeSum(self, nums: List[int]) -> List[List[int]]:
nums.sort()
res =[]
i = 0
for i in range(len(nums)):
if i == 0 or nums[i]>nums[i-1]: ## 这个一步很重要
l = i+1
r = len(nums)-1
while l < r:
s = nums[i] + nums[l] +nums[r]
if s ==0:
res.append([nums[i],nums[l],nums[r]])
l +=1
r -=1
while l < r and nums[l] == nums[l-1]: ## 优化
l += 1
while r > l and nums[r] == nums[r+1]: ## 优化
r -= 1
elif s>0:
r -=1
else :
l +=1
return res

输出结果:

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

python实现经典算法的更多相关文章

  1. python每日经典算法题5(基础题)+1(中难题)

    现在,越来越多的公司面试以及考验面试对算法要求都提高了一个层次,从现在,我讲每日抽出时间进行5+1算法题讲解,5是指基础题,1是指1道中等偏难.希望能够让大家熟练掌握python的语法结构已经一些高级 ...

  2. python每日经典算法题5(基础题)+1(较难题)

    一:基础算法题5道 1.阿姆斯特朗数 如果一个n位正整数等于其各位数字的n次方之和,则称该数为阿姆斯特朗数.判断用户输入的数字是否为阿姆斯特朗数. (1)题目分析:这里要先得到该数是多少位的,然后再把 ...

  3. python 实现经典算法

    import time start_time = time.clock() list_ = [9, 2, 7, 4, 5, 6, 3, 8, 1] """ # 堆排序(通 ...

  4. 机器学习经典算法详解及Python实现--基于SMO的SVM分类器

    原文:http://blog.csdn.net/suipingsp/article/details/41645779 支持向量机基本上是最好的有监督学习算法,因其英文名为support vector  ...

  5. 机器学习经典算法具体解释及Python实现--线性回归(Linear Regression)算法

    (一)认识回归 回归是统计学中最有力的工具之中的一个. 机器学习监督学习算法分为分类算法和回归算法两种,事实上就是依据类别标签分布类型为离散型.连续性而定义的. 顾名思义.分类算法用于离散型分布预測, ...

  6. 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法

    (一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...

  7. python数据结构与算法——归并排序

    归并排序: 原理与C语言实现 参考:白话经典算法系列之五 归并排序的实现 1. 容易对有序数组A,B进行排序. 2. 为了使得A,B组内数据有序:可以将A,B组各自再分成二组. 3. 经过不断分组,当 ...

  8. 【转】你真的理解Python中MRO算法吗?

    你真的理解Python中MRO算法吗? MRO(Method Resolution Order):方法解析顺序. Python语言包含了很多优秀的特性,其中多重继承就是其中之一,但是多重继承会引发很多 ...

  9. Python数据结构与算法--算法分析

    在计算机科学中,算法分析(Analysis of algorithm)是分析执行一个给定算法需要消耗的计算资源数量(例如计算时间,存储器使用等)的过程.算法的效率或复杂度在理论上表示为一个函数.其定义 ...

随机推荐

  1. (十四)c#Winform自定义控件-键盘(一)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  2. lxml解析网页

    目录 1. 什么是lxml 2. 初次使用 3. xpath 3.2 标签定位 3.3 序列定位 3.4 轴定位 4. 实例 1. 什么是lxml lxml是干什么的?简单的说来,lxml是帮助我们解 ...

  3. Spring Cloud Gateway 服务网关快速上手

    Spring Cloud Gateway 服务网关 API 主流网关有NGINX.ZUUL.Spring Cloud Gateway.Linkerd等:Spring Cloud Gateway构建于 ...

  4. ServerResponse(服务器统一响应数据格式)

    ServerResponse(服务器统一响应数据格式) 前言: 其实严格来说,ServerResponse应该归类到common包中.但是我实在太喜欢这玩意儿了.而且用得也非常频繁,所以忍不住推荐一下 ...

  5. 建立apk定时自动打包系统第一篇——Ant多渠道打包并指定打包目录和打包日期

    ​团队开发时,每天都需要输出一个apk包给其它部门的同事测试验证.打包几乎是每天必须完成的功课.如果用IDE来输出apk,那速度是非常慢的,如果还需要有不同渠道的apk包,那程序猿都要疯了.当然也有用 ...

  6. MyBatis的parameterType传入参数类型

    在mybatis映射接口的配置中,有select,insert,update,delete等元素都提到了parameterType的用法,parameterType为输入参数,在配置的时候,配置相应的 ...

  7. Codeforces 975C

    题意略. 思路:这题考察的是二分搜索. #include<bits/stdc++.h> #define maxn 200005 using namespace std; typedef l ...

  8. Python Web Flask源码解读(二)——路由原理

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  9. ACM-数论-广义欧拉降幂

    https://www.cnblogs.com/31415926535x/p/11447033.html 曾今一时的懒,造就今日的泪 记得半年前去武大参加的省赛,当时的A题就是一个广义欧拉降幂的板子题 ...

  10. Python中yield解析

    小探yield 查看 python yield 文档 yield expressions: Using a yield expression in a function's body causes t ...