python面试算法

2019-04-14  本文已影响0人  _不辞而别

python内置数据结构算法常考

常用的内置算法和数据结构

数据结构/算法 语言内置 内置库
线性结构 list/tuple array/collections.namedtuple
链式结构 collections.deque(双端队列)
字典结构 dict collections.Counter(计数器)/OrderedDict(有序字典)
集合结构 set(集合)/frozenset(不可变集合)
排序算法 sorted
二分算法 bisect模块
堆算法 heapq模块
缓存算法 functools.lru_cache(python3)

算法常考题

排序+查找,重中之重

排序算法中的稳定性

什么是排序算法的文档性

快排

def quicksort(arr):
  if len(arr) < 2:
    return arr
  else:
    pivot_index = 0
    pivot = arr[pivot_index]
    less_part = [
      i for i in arr[pivot_index+1:] if i <= pivot
    ]
    great_part = [
      i for i in arr[pivot_index+1:] if i > pivot
    ]
  return quicksort(less_part) + [pivot]+ quicksort(great_part)

归并排序

合并两个有序数组

def merge_sorted_list(sorted_a, sorted_b):
  length_a ,length_b = len(sorted_a), len(sorted_b)
  a = b = 0
  new_sorted_seq = []

  while a< length_a and b < length_b:
    if sorted_a[a] < sorted_b[b]:
      new_sorted_seq.append(sorted_a[a])
      a += 1
    else:
      new_sorted_seq.append(sorted_b[b])
      b += 1
  if a<length_a:
    new_sorted_seq.extend(sorted_a[a:])
  else:
    new_sorted_seq.extend(sorted_b[b:])
  return new_sorted_seq

实现归并排序

def mergesort(arr):
  #递归出口
  if len(arr) <= 1:
    return arr
  else:
    mid = int(len(arr)/2)
    left_half = mergesort(arr[:mid])
    right_half = mergesort(arr[mid:])
    return merge_sorted_list(left_half, right_half)

实现堆排序

def heapsort_use_heapq(iterable):
  from heapq import heappush, heappop
  items = []
  for value in iterable:
    heappush(items, value)
  return [heappop(items for i in range(len(items)]

二分查找

def binary_search(sorted_array, val):
  if not sorted_array:
    return -1
  beg = 0
  end = len(sorted_array) - 1
  while beg <= end:
    mid = int((beg + end) / 2)
    if sorted_array[mid] == val:
      return mid
    elif sorted_array[mid] > val:
      end = mid - 1
    else:
      beg = mid + 1
  return -1 

python 数据结构常考题

python web后端常考数据结构

数据结构链表

链表有单链表、双链表、循环双端链表

"""
反转链表
"""
class ListNode:
   def __init__(self, x):
    self.val = x
    self.next = None


class Solution:
  def reverseList(self, head):
    pre = None
    cur = head
    while cur:
      nextcode = cur.next
      cur.next = pre
      pre = cur
      cur = nextcode
    return pre

常考数据结构队列

队列先进先出结构

from collections import deque

class Queue:
  def __init__(self):
    self.items = deque()

  def append(self, val):
    return self.items.append(val)

  def pop(self):
    return self.items.popleft()

  def empty(self):
    return len(self.items) == 0

常考数据结构栈

栈是后进先出结构

from collections import deque

class Stack(object):
  def __init__(self):
    self.deque = deque()

  def push(self, value):
    self.deque.append(value)

  def pop(self):
    return self.deque.pop()

常考数据结构之字典与集合

python dict/set底层都是哈希表

哈希表如何解决冲突

链接法和开发寻址法

常考数据结构二叉树

先序、后序、后序遍历

树的遍历方式

先序遍历,其实很简单,递归代码里先处理根就好了

class BinTreeNode():
  def __init__(self,  data, left=None, right=None):
    self.data, self.left, self.right = data, left, right

class BinTree():
  def __init__(self, root = None):
    self.root = root

  def preorder_trav(self, subtree):
    if subtree is not None:
      print(subtree.data)
      self.preorder_trav(subtree.left)
      self.preorder_trav(subtree.right)

常考数据结构堆

堆其实是完全二叉树,有最大堆和最小堆

import heapq

class TopK:
  """
  获取大量元素 topk 大个元素,固定内存
  思路:
  1、先放入元素前k个建立一个最小堆
  2、迭代剩余元素: 
    如果当前元素小于堆顶元素,跳过该元素
    否则替换堆顶元素为当前元素,并重新调整堆
  """
  def __init__(self, iterable, k):
    self.minheap = []
    self.capacity = k
    self.iterable = iterable

  def push(self, val):
    if len(self.minheap)>= self.capacity:
      min_val = self.minheap[0]
      if val < min_val:
        pass
      else:
        heapq.heapreplace(self.minheap, val)
    else:
      heapq.heappush(self.minheap, val)

  def get_topk(self):
    for val in self.iterable:
      self.push(val)
    return self.minheap
上一篇 下一篇

猜你喜欢

热点阅读