python计算机科学基础知识面试题案例

以下是用 Python 实现的二分查找算法:

def binary_search(list, target):
    """
    二分查找算法
    """
    low = 0
    high = len(list) - 1

    while low <= high:
        mid = (low + high) // 2
        if list[mid] == target:
            return mid
        elif list[mid] < target:
            low = mid + 1
        else:
            high = mid - 1

    return -1

在上面的代码中,list 表示要进行查找的有序列表,target 表示查找的目标值。

在算法开始时,我们首先设置 low=0high=len(list)-1。这表示我们要查找整个列表。然后我们在 while 循环中不断缩小查找范围,直到找到目标值或者无法再缩小范围。

在每一次循环中,我们首先计算出中间值 mid,并将其与目标值进行比较。如果相等,那么我们就直接返回中间值 mid。如果中间值小于目标值,那么说明目标值应该在中间值的右侧,因此我们将 low 设置为 mid + 1。如果中间值大于目标值,那么说明目标值应该在中间值的左侧,因此我们将 high 设置为 mid - 1。当 low 大于 high 时,表示查找失败,此时我们直接返回 -1。

下面我们可以调用上面的函数来查找数字 5 是否在有序列表 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 中:

print(binary_search([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], 5))

运行上面的代码后,我们将得到输出结果 4。这表示数字 5 在列表中的索引位置为 4。

以下是用 Python 实现的判断回文串的函数:

def is_palindrome(s):
    """
    判断一个字符串是否是回文串
    """
    s = s.lower()  # 转换为小写字母
    s = ''.join(e for e in s if e.isalnum())  # 去掉空格和非字母数字字符
    return s == s[::-1]  # 判断反转后的字符串是否与原来相等

在这个函数中,我们将输入字符串 s 转换为小写字母,然后使用字符串的切片操作 [::-1] 获得字符串的反转形式。最后,我们将反转后的字符串与原来的字符串进行比较,如果相等,则返回 True,否则返回 False。

下面我们可以调用上面的函数来判断一个字符串是否是回文串:

print(is_palindrome("A man, a plan, a canal: Panama"))

输出结果为 True,因为输入的字符串 “A man, a plan, a canal: Panama” 是一个回文串。

这个函数的实现过程中,我们使用了 Python 的字符串函数 lower() 将输入字符串转换为小写字母形式。另外,我们还使用了字符串的 isalnum() 方法,该方法用于检查字符串是否只包含字母和数字。使用列表推导式去除除字母数字以外的字符。

LRU Cache(Least Recently Used Cache)算法是一种常见的缓存淘汰策略。它的基本思想是:如果一个数据在最近一段时间内没有被访问到,那么在将来其被访问的概率也很小,因此可以被选择删除。

下面是用 Python 实现的简单 LRU Cache 算法:

from collections import OrderedDict

class LRUCache:

    def __init__(self, capacity: int):
        self.capacity = capacity
        self.cache = OrderedDict()

    def get(self, key: int) -> int:
        if key not in self.cache:
            return -1
        self.cache.move_to_end(key)
        return self.cache[key]

    def put(self, key: int, value: int) -> None:
        if key in self.cache:
            del self.cache[key]
        self.cache[key] = value
        self.cache.move_to_end(key)
        if len(self.cache) > self.capacity:
            self.cache.popitem(last=False)

在上面的代码中,我们使用了 Python 的 collections 模块中的 OrderedDict 类来实现 LRU Cache 算法。这个类的实例就像一个普通的字典,但是它可以记录插入键值对的顺序。这使得我们可以访问最近插入的条目。

__init__ 方法中,我们将实例变量 capacity 设置为传递进来的参数。这个变量表示缓存的最大容量。然后我们创建一个空的 OrderedDict 来存储缓存条目。

get 方法中,我们首先判断缓存中是否存在与输入 key 相对应的条目。如果不存在,那么我们直接返回 -1。否则,我们将输入 key 对应的条目移到字典的顶部,并返回该条目对应的值。

put 方法中,我们首先判断缓存中是否已经存在输入 key 对应的条目。如果存在,我们即可覆盖该条目的值,并将它移动到字典的顶部。如果不存在,我们需要在字典的顶部插入新的条目,并且判断字典的容量是否超过了 capacity,如果超过了,我们就删除字典底部的最近未使用条目。

下面我们可以创建一个最大容量为 3 的 LRU Cache 对象,并通过调用 putget 方法来测试它的功能:

cache = LRUCache(3)
cache.put(1, 1)
print(cache.cache)
cache.put(2, 2)
print(cache.cache)
cache.put(3, 3)
print(cache.cache)
cache.get(1)
print(cache.cache)
cache.put(4, 4)
print(cache.cache)
cache.get(2)
print(cache.cache)

运行上面的代码,我们将得到以下输出:

OrderedDict([(1, 1)])
OrderedDict([(1, 1), (2, 2)])
OrderedDict([(1, 1), (2, 2), (3, 3)])
OrderedDict([(2, 2), (3, 3), (1, 1)])
OrderedDict([(3, 3), (1, 1), (4, 4)])
OrderedDict([(1, 1), (4, 4), (3, 3)])

这个例子中,我们创建了一个最大容量为 3 的 LRU Cache 对象,并依次向它插入了键值对 (1, 1)(2, 2)(3, 3)。然后,我们调用了 get 方法来获取键为 12 的条目。最后,我们插入了一个额外的键值对 (4, 4)。在插入第 4 个条目时,由于 LRU Cache 的容量已达到最大值,因此先删除了最近最少使用的键值对 (2, 2)

展开阅读全文

页面更新:2024-03-02

标签:条目   缓存   变量   算法   计算机科学   字典   基础知识   实例   容量   对象   案例   代码   方法

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top