说实话我都不好意思写出这篇文章,接到一个大厂的二面,心情是无比的激动和期望,越是期望有可能就搞砸了:面试官是个美女小姐姐,看到有点小紧张,讲完个人经历,介绍项目业务时候突然有点磕磕巴巴,好歹把业务介绍完了.然后面试官问了一些原理比如线程和进程区别,python打开文件的方式等待,这些问题对我来说还是不难的,说完线程和进程区别,小姐姐没有响应,顿时心想:难道有说错的地方?然后又重新说了一遍,感觉越说越多,从线程又说多多线程并发上,后来感觉说多了,面试官也没打消我,就赶紧说了几句草草了事.又在说python打开文件方式是用with 关键字,一旦出现异常就不用自己close文件,又说了一大堆* ,面试官问了一句:一定不用自己close掉?我说是的,然后面试官没有作声,难道自己说错了?场面一度很尴尬
接下来平生就是最尴尬的事情了,写一段代码:1.字符串去重排序.当时那个大脑啊不知道怎么回事就不动了,我知道python list 排序是用sort方法,可怎么老是想不到去重,Java中有set集合是有序不可重复,当时脑子就短路了,这种题以前都写过N次了,当时脑袋蒙蒙的只想用dict 字典 key的不可重复的方式去重,写了一段代码运行报错更加紧张了,编译器当时也不知道怎么回事异常退出了,越来越着急...接着写了下一个问题:一行代码实现1-100求和,突然灵光一闪,python基础sum函数,但是sum函数中要传入可迭代对象,难道写个1-100集合放进去么?这也不是一行代码,就是用range函数也要遍历,哎呦我这个脑子只想着把数据展开了,可想而知又答得不是很好,还有问题3:二维数组判断是否含有某个元素,立马想起Java 中有indexOf方法对应着python in 方法,可是怎么也没有想起第二次遍历数组如何遍历,如果当时自己能随便写一个二维数组变量也不至于想不起来第二次如何遍历...不过有个问题我确实没用python写过,排序算法:快速排序,以前记得Java写过,场面一度沉默了,又尴尬又不知道如何是好...后来面试官说就到这吧...心想凉凉了,可惜这么难的机会黄了...唉!
第二天去公司回想了面试的问题:这时候不知道灵感哪里来了,嗖嗖把3个问题写完了,第四个快排问题查看了一下博客 也写了出来,通过这次面试总结了下:心里素质还是太柔弱,基础知识还是不太扎实,看来还是得经常回顾基础不能为了实现功能而写代码
把这次代码粘出来,希望有后来人碰到这种情况能安然无恙,珍惜机会
# -*- coding: UTF-8 -*- #
def number_sum():
"""求和1-100"""
# return sum(range(1, 101))
return sum(range(101))
def range_fun():
"""
range函数 范围
:return:
"""
for i in range(1, 5):
print(i)
# 从1到5 2代表步长
for i in range(1, 5, 2):
print(i)
def list_list():
"""
二维数组
:return:
"""
list2d = [[1, 2, 3], [4, 5, 6]]
sum = 0
for i in range(len(list2d)):
for j in range(len(list2d[i])):
print(list2d[i][j])
sum += list2d[i][j]
print(sum)
# 根据数据类型简单写法
for list1 in list2d:
for l in list1:
print(l)
sum += l
print(sum)
def lambda_fun():
"""
求乘积,平方等
:return:
"""
res = lambda x, y: x * y # 相乘
print(res(4, 6))
a = lambda x: x * x # 平方
def bubble_sort(list):
"""
冒泡排序
:param list:
:return:
"""
count = len(list)
# 第一遍遍历
for i in range(count):
# 第二次遍历
for j in range(1, count - i):
if list[j - 1] > list[j]:
# 交换赋值
list[j - 1], list[j] = list[j], list[j - 1]
return list
def selection_sort(list):
"""
选择排序
:return:
"""
n = len(list)
for i in range(0, n):
min = i
for j in range(i + 1, n):
if list[j] < list[min]:
min = j
list[min], list[i] = list[i], list[min]
return list
def insert_sort(list):
"""
插入排序
插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入
:param list:
:return:
"""
n = len(list)
for i in range(1, n):
# 后一个元素和前一个元素比较 如果比前一个小
if list[i] < list[i - 1]:
# 将这个数取出
temp = list[i]
# 保存下标
index = i
# 从后往前依次比较每个元素
for j in range(i - 1, -1, -1):
# 和比取出元素大的元素交换
if list[j] > temp:
list[j + 1] = list[j]
index = j
else:
break
# 插入元素
list[index] = temp
return list
def shell_sort(list):
"""
希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。
希尔排序是基于插入排序的以下两点性质而提出改进方法的:
插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率
但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位。
:param list:
:return:
"""
n = len(list)
# 初始步长
gap = n // 2
while gap > 0:
for i in range(gap, n):
# 每个步长进行插入排序
temp = list[i]
j = i
# 插入排序
while j >= gap and list[j - gap] > temp:
list[j] = list[j - gap]
j -= gap
list[j] = temp
# 得到新的步长
gap = gap // 2
return list
def merge_sort(list):
"""
归并排序
:param list:
:return:
"""
# 认为长度不大于1的数列是有序的
if len(list) <= 1:
return list
# 二分列表
middle = len(list) // 2
left = merge_sort(list[:middle])
right = merge_sort(list[middle:])
# 最后一次合并
return merge(left, right)
# 合并
def merge(left, right):
l, r = 0, 0
result = []
while l < len(left) and r < len(right):
if left[l] < right[r]:
result.append(left[l])
l += 1
else:
result.append(right[r])
r += 1
result += left[l:]
result += right[r:]
return result
def quick_sort(list):
"""
快速排序
:param list:
:return:
"""
less = []
pivotList = []
more = []
# 递归出口
if len(list) <= 1:
return list
else:
# 将第一个值做为基准
pivot = list[0]
for i in list:
# 将比急转小的值放到less数列
if i < pivot:
less.append(i)
# 将比基准打的值放到more数列
elif i > pivot:
more.append(i)
# 将和基准相同的值保存在基准数列
else:
pivotList.append(i)
# 对less数列和more数列继续进行排序
less = quick_sort(less)
more = quick_sort(more)
return less + pivotList + more
if __name__ == '__main__':
# print(number_sum())
# range_fun()
# list_list()
# lambda_fun()
list = [1, 3, 5, 2, 6, 234, 546, 23, 234, 4, 5]
print(quick_sort(list))