测试开发基础 | Python 算法与数据结构面试题系列一(附答案)

  1. 时间复杂度问题
    已知 AList = [1, 2, 3],BSet = {1, 2, 3} (1)从AList和BSet中查找4,最坏时间复杂度哪个大?(2)从AList和BSet中插入4,最坏时间复杂度哪个大?

答:

对于查找,列表和集合的最坏时间复杂度都是O(n),所以一样的。
列表操作插入的最坏时间复杂度为o(n), 集合为o(1),所以Alist大。set是哈希表所以操作的复杂度基本上都是o(1)。

  1. 用 Python 实现一个二分查找的函数
    答:

def binary_search(arr, target):
n = len(arr)
left = 0
right = n - 1
while left <= right :
mid = (left + right) // 2
if arr[mid] < target:
left = mid + 1
elif arr[mid] > target:
right = mid - 1
else :
print(f"index:{mid},value:{arr[mid]}")
return True
return False

if name == 'main':
l = [1, 3, 4, 5, 6, 7, 8]
binary_search(l, 8)

  1. Python 单例模式的实现方法
    答:

实现单例模式的方法有多种,之前再说元类的时候用 call 方法实现了一个单例模式,另外 Python 的模块就是一个天然的单例模式,这里我们使用 new 关键字来实现一个单例模式。

通过 new 函数实现简单的单例模式。

class Book:
def new(cls, title):
if not hasattr(cls, "_ins"):
cls._ins = super().new(cls)
print('in new')
return cls._ins

def __init__(self, title):
    print('in __init__')
    super().__init__()
    self.title = title

if name == 'main':
b = Book('The Spider Book')
b2 = Book('The Flask Book')
print(id(b))
print(id(b2))
print(b.title)
print(b2.title)

  1. 使用 Python 实现一个斐波那契数列
    答:

斐波那契数列:数列从第3项开始,每一项都等于前两项之和。

def fibonacci(num):
a, b = 0, 1
l = [a, b]
for i in range(num):
a, b = b, a + b
l.append(b)
return l

if name == 'main':
print(fibonacci(10))

  1. 找出列表中的重复数字
    答:

思路:从头扫到尾,只要当前元素值与下标不同,就做一次判断,numbers[i] 与 numbers[numbers[i]] 相等就认为找到了重复元素,返回 true;否则就交换两者,继续循环。直到最后还没找到认为没找到重复元素。

-- coding:utf-8 --

class Solution:
def duplicate(self, numbers):
if numbers is None or len(numbers) <= 1:
return False
use_set = set()
duplication = {}
for index, value in enumerate(numbers):
if value not in use_set:
use_set.add(value)
else:
duplication[index] = value
return duplication

if name == 'main':
s = Solution()
d = s.duplicate([1, 2, -3, 4, 4, 95, 95, 5, 2, 2, -3, 7, 7, 5])
print(d)

  1. 找出列表中的单个数字
    答:

def find_single(l :list):
result = 0
for v in l:
result ^= v
if result == 0:
print("没有落单元素")
else :
print("落单元素", result)

if name == 'main':
l = [1, 2, 3, 4, 5, 6, 2, 3, 4, 5, 6]
find_single(l)

  1. 写一个冒泡排序
    答:

def bubble_sort(arr):
n = len(arr)
for i in range(n - 1):
for j in range(n - i - 1):.
if arr[j] > arr[j + 1]:
arr[j], arr[j + 1] = arr[j + 1], arr[j]

if name == 'main':
l = [1, 2, 3, 4, 5, 55, 6, 3, 4, 5, 6]
bubble_sort(l)
print(l)

  1. 写一个快速排序
    答:

def quick_sort(arr, first, last):
if first >= last:
return
mid_value = arr[first]
low = first
high = last
while low < high:
while low < high and arr[high] >= mid_value:
high -= 1 # 游标左移
arr[low] = arr[high]

while low < high and arr[low] < mid_value:
    low += 1
    arr[high] = arr[low]
    arr[low] = mid_value

quick_sort(arr, first, low - 1)
quick_sort(arr, low + 1, last)

if name == 'main':
l = [1, 2, 3, 4, 5, 55, 6, 3, 4, 5, 6]
quick_sort(l, 0, len(l) - 1)
print(l)

  1. 写一个拓扑排序
    答:

对应于该图的拓扑排序。每一个有向无环图都至少存在一种拓扑排序。

import pysnooper
from typing import Mapping

@pysnooper.snoop()
def topological_sort(graph:Mapping):

in_degrees = {'a': 0, 'b': 0, 'c': 0, 'd': 0, 'e': 0, 'f': 0}

in_degrees = dict((u, 0) for u in graph)
for u in graph:
    for v in graph[u]:  # 根据键找出值也就是下级节点
        in_degrees[v] += 1  # 对获取到的下级节点的入度加 1
# 循环结束之后的结果: {'a': 0, 'b': 1, 'c': 1, 'd': 2, 'e': 1, 'f': 4}
Q = [u for u in graph if in_degrees[u] == 0]  # 入度为 0 的节点
in_degrees_zero = []
while Q:
    u = Q.pop()  # 默认从最后一个移除
    in_degrees_zero.append(u)  # 存储入度为 0 的节点
    for v in graph[u]:
        in_degrees[v] -= 1  # 删除入度为 0 的节点,以及移除其指向
        if in_degrees[v] == 0:
        Q.append(v)
return in_degrees_zero

if name == 'main':

用字典的键值表示图的节点之间的关系,键当前节点。值是后续节点。

graph_dict = {
        'a': 'bf',  # 表示 a 指向 b 和 f
        'b': 'cdf',
        'c': 'd',
        'd': 'ef',
        'e': 'f',
        'f': ''}

t = topological_sort(graph_dict)
print(t)
  1. Python 实现一个二进制计算
    答:

二进制加法

def binary_add(a:str, b: str):
return bin(int(a, 2) + int(b, 2))[2:]

if name == 'main':
num1 = input("输入第一个数,二进制格式:\n")
num2 = input("输入第二个数,二进制格式:\n")
print(binary_add(num1, num2))
更多 Python 编程常见面试题,我们后续继续分享,敬请关注。

(文章来源于霍格沃兹测试学院)

更多技术文章可点击获取http://qrcode.testing-studio.com/f?from=jianshu&url=https://ceshiren.com/t/topic/3822

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,881评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,052评论 1 301
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,598评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,407评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,823评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,872评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,037评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,778评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,505评论 1 247
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,745评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,233评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,231评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,141评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,939评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,954评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,784评论 2 275

推荐阅读更多精彩内容