测开面试 | Python常问算法

1、排序

  • 从小到大排序:sorted(list)
  • 从大到小排序:sorted(list, reverse=True)
  • sort() 方法,改变原有数组的顺序
  • sort(reverse=True)
#!/bin/Python
alist = [1, 4, 2, 3, 7, 6]
print(sorted(alist))
print(sorted(alist, reverse=True))
alist.sort()
print(alist)
alist.sort(reverse=True)
print(alist)

2、冒泡

  • 1.比较相邻的元素,如果第一个比第二个大,就交换
  • 2.一轮遍历,每两个相邻的元素,重复第 1 步,最大的放队尾
  • 3.不包括已经排队尾的,重复第 2 步
#!/bin/Python
# -*- coding: UTF-8 -*-
#冒泡排序
def bubble_sort(lists):
    #获取数组长度
    count = len(lists) - 1
    #N个元素遍历N次
    for index in range(count, 0, -1):
        #第i个和i+1个依次对比
        for sub_index in range(index):
            #大的元素冒上去
            if lists[sub_index] > lists[sub_index + 1]:
                lists[sub_index], lists[sub_index + 1] = lists[sub_index + 1], lists[sub_index]
    return lists
alist = [1, 4, 2, 3, 7, 6]
print(bubble_sort(alist))

3、快排

  • 1.从列表中挑出一个元素,作为基准值 key
  • 2.所有小于 key 的元素放左边,所有大于 key 的元素放右边
  • 3.分别递归左侧列表,右侧列表
#!/bin/Python
# -*- coding: UTF-8 -*-

#快速排序
def quick_sort(lists, left, right):
    #递归过程中,发现left和right一致时,停止递归,直接返回列表
    if left >= right:
        return lists
    #定义游标
    low = left
    high = right

    #取参考标志,最左边的元素
    key = lists[low]
    while low < high:
        #从最右侧向左,依次和标志元素对比,如果右侧的元素大于等于标志元素
        while low < high and lists[high] >= key:
            #右侧减1
            high -= 1
        #如果右侧的元素小于标志元素,则low赋high值
        lists[low] = lists[high]

        #从最左侧向右,依次和标志元素对比,如果左侧的元素小于等于标志元素
        while low < high and lists[low] <= key:
            #左侧加1
            low += 1
        #如果左侧的元素大于标志元素,则high赋low值
        lists[high] = lists[low]

    #最后给high位置赋值
    lists[high] = key

    #处理左侧元素
    quick_sort(lists, left, low - 1)
    #处理右侧元素
    quick_sort(lists, low + 1, right)
    return lists

alist = [0, 10, 88, 19, 9, 1, 7]
print(quick_sort(alist, 0, 6))

4、堆排序

  • 堆排序指利用堆的数据结构设计的一种排序算法
  • 堆近似于一个完全二叉树结构
  • 子节点的键值小于(或者大于)它的父节点
#!/bin/Python
# -*- coding: UTF-8 -*-

#堆排序
def heap_sort(lst):
    def sift_down(start, end):
        """最大堆调整"""
        root = start
        print "root %d start %d end %d" % (root, start, end)
        while True:
            child = 2 * root + 1
            #print "child index: %d" % child

            #终止条件,孩子的索引值超过数组最大长度
            if child > end:
                break
            #print "lst child value: %d" % lst[child]

            #确定最大的孩子节点的索引值
            if child + 1 <= end and lst[child] < lst[child + 1]:
                child += 1
                #print "child+1 index: %d" % child

            #孩子节点最大值和根节点交换
            if lst[root] < lst[child]:
                lst[root], lst[child] = lst[child], lst[root]
                #print "lstroot %d" %d lst[root], "lstchild %d" % lst[child]
                root = child
                #print "root %d" % root
            else:
                break

    print("---------------创建最大堆---------------")
    #创建最大堆
    print(xrange((len(lst) - 2) // 2, -1, -1))
    for start in xrange((len(lst) - 2) // 2, -1, -1):
        print "---->Loop start %d" % start
        sift_down(start, len(lst) - 1)
        print(lst)

    print("---------------排序过程---------------")
    #堆排序
    for end in xrange(len(lst) - 1, 0, -1):
        #首尾交换
        lst[0], lst[end] = lst[end], lst[0]
        #剩余重新堆排序
        sift_down(0, end - 1)
        print(lst)
    return lst


alist = [70, 60, 12, 40, 30, 8, 10]
print(heap_sort(alist))

5、二分查找

  • 二分查找又称折半查找
  • 必须采用顺序存储结构
  • 必须按关键字大小有序排列
#!/bin/Python
# -*- coding: UTF-8 -*-

#二分查找
#原始数组
alist = [0, 1, 10, 88, 19, 9, 1]

def binary_search(arr, start, end, hkey):
    if start > end:
        #返回-1,表示程序出现异常
        return -1
    #先找到数组索引的中间值
    mid = start + (end - start) / 2
    #如果中间值大于查找的值,则从中间值左边的数组中查找
    if arr[mid] > hkey:
        return binary_search(arr, start, mid - 1, hkey)
    #如果中间值小于查找的值,则从中间值右边的数组中查找
    if arr[mid] < hkey:
        return binary_search(arr, mid + 1, end, hkey)
    #返回查找的值所在的索引值
    return mid

#给数组排序
alist = sorted(alist)
#打印出排序后的数组
print(alist)
#执行程序
print binary_search(alist, 0, 6, 9)

6、素数

  • 素数又称质数
  • 0,1 不是素数
  • 除了 1 和它本身外,不能被其他自然数整除的数
#!/bin/Python
# -*- coding: UTF-8 -*-

#素数
def is_prime(n):
    #0,1 不是素数
    if n <= 1:
        return False

    #除了 1 和它本身外,不能被其他自然数整除的数
    for i in range(2, n):
        if n % i == 0:
            return False
    return True

for i in range(0, 100):
    if is_prime(i):
        print i

欢迎关注微信公众号"测试开发Stack"

转载于:https://www.cnblogs.com/liushengchieh/p/10963422.html

<think>我们正在处理用户查询:"Python面试常见算法题目汇总" 根据引用内容,我们注意到引用[1]中提到生成式(推导式)是面试必考内容,引用[2]和[3]提到了一些Python基础问题,引用[4]提到了可变对象和不可变对象。 但是用户特别关注的是算法题目,因此我们需要汇总常见的算法题目。 常见的Python算法面试题包括但不限于: 1. 排序算法(如快速排序、归并排序、冒泡排序等) 2. 查找算法(如二分查找) 3. 数据结构相关(如链表、栈、队列、树、图等操作) 4. 字符串操作(如反转字符串、回文判断等) 5. 递归和动态规划问题(如斐波那契数列、爬楼梯问题等) 6. 数组和列表操作(如两数之和、合并区间等) 7. 其他经典问题(如汉诺塔、八皇后问题等) 由于引用[1]中提到了快速排序的代码示例,我们可以从排序算法始。 下面汇总一些常见的算法题目及其简要解答(由于篇幅限制,每个算法只给出一个示例,并尽量参考引用内容):</think>### Python面试常见算法题目汇总 以下是Python面试中高频出现的算法题目,涵盖基础数据结构、排序、搜索及经典问题,附简要解析和代码示例: --- #### **1. 排序算法** **快速排序**(分治思想) 平均时间复杂度:$O(n \log n)$ ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[0] left = [x for x in arr[1:] if x < pivot] # 小于基准的子数组 right = [x for x in arr[1:] if x >= pivot] # 大于等于基准的子数组 return quick_sort(left) + [pivot] + quick_sort(right) # 递归合并 ``` **应用场景**:大规模数据排序、内存受限场景[^1]。 **归并排序**(分治+合并) ```python def merge_sort(arr): if len(arr) <= 1: return arr mid = len(arr) // 2 left = merge_sort(arr[:mid]) right = merge_sort(arr[mid:]) return merge(left, right) # 合并有序子数组 ``` --- #### **2. 查找算法** **二分查找**(有序数组) 时间复杂度:$O(\log n)$ ```python def binary_search(arr, target): low, high = 0, len(arr)-1 while low <= high: mid = (low + high) // 2 if arr[mid] == target: return mid elif arr[mid] < target: low = mid + 1 else: high = mid - 1 return -1 ``` --- #### **3. 字符串操作** **反转字符串** ```python def reverse_string(s): return s[::-1] # 切片操作 ``` **判断回文串** ```python def is_palindrome(s): return s == s[::-1] # 利用切片反转 ``` --- #### **4. 链表操作** **反转链表** ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def reverse_list(head): prev = None while head: next_node = head.next head.next = prev prev = head head = next_node return prev ``` --- #### **5. 动态规划** **斐波那契数列**(优化递归) ```python def fibonacci(n): a, b = 0, 1 for _ in range(n): a, b = b, a + b return a ``` **爬楼梯问题**(斐波那契变种) 到达第$n$阶的方法数:$f(n) = f(n-1) + f(n-2)$ --- #### **6. 数组与数学** **两数之和**(哈希优化) ```python def two_sum(nums, target): seen = {} for i, num in enumerate(nums): if target - num in seen: return [seen[target-num], i] seen[num] = i return [] ``` **最大子序和**(动态规划) ```python def max_subarray(nums): max_sum = current_sum = nums[0] for num in nums[1:]: current_sum = max(num, current_sum + num) max_sum = max(max_sum, current_sum) return max_sum ``` --- #### **7. 树结构遍历** **二叉树前序遍历**(非递归) ```python def preorder_traversal(root): stack, res = [root], [] while stack: node = stack.pop() if node: res.append(node.val) stack.append(node.right) # 右子节点先入栈 stack.append(node.left) # 左子节点后入栈 return res ``` --- ### 相关问题 1. **快速排序在什么情况下会退化为$O(n^2)$?如何优化?** 2. **如何用Python实现堆排序?时间复杂度是多少?** 3. **动态规划解决背包问题的核心思想是什么?** 4. **如何判断链表是否有环?空间复杂度$O(1)$的解法是什么?** 5. **归并排序和快速排序在实际应用中的优劣对比?** [^1]: Python面试基础篇 - 50道经典面试题(附答案及多种解答) [^2]: 【Python面试官喜欢问的100个面试问题 [^3]: python面试常见问题汇总(1-30) [^4]: 2024最全面Python面试笔试题库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值