day09面试题
发布人:shili8
发布时间:2025-02-01 02:47
阅读次数:0
**Day09 面试题**
### 一、算法题#### 题目1:两数之和给定一个整数数组 `nums` 和一个目标值 `target`,找出两个数字,使得它们的和等于 `target`。返回这两个数字所对应的下标。
**示例1:**
输入:`nums = [2,7,11,15]`, `target =9`
输出:`[0,1]`
解释:因为 `nums[0] + nums[1] ==9`,所以返回 `[0,1]`。
**示例2:**
输入:`nums = [3,2,4]`, `target =6`
输出:`[1,2]`
解释:因为 `nums[1] + nums[2] ==6`,所以返回 `[1,2]`。
**示例3:**
输入:`nums = [3,3]`, `target =6`
输出:`[0,1]`
解释:因为 `nums[0] + nums[1] ==6`,所以返回 `[0,1]`。
def twoSum(nums, target): """ Given an array of integers and a target value, find the two numbers that add up to the target. Args: nums (list): A list of integers. target (int): The target value. Returns: list: A list containing the indices of the two numbers. """ num_dict = {} # Create an empty dictionary to store the numbers and their indices for i, num in enumerate(nums): # For each number in the array, check if its complement (target - num) is in the dictionary if target - num in num_dict: # If it is, return the current index and the index of the complement return [num_dict[target - num], i] # Otherwise, add the current number and its index to the dictionary num_dict[num] = i # If no solution is found, return an empty list return []
#### 题目2:最长公共子序列给定两个字符串 `s1` 和 `s2`,找到它们的最长公共子序列。
**示例1:**
输入:`s1 = "abcde"`, `s2 = "ace"`
输出:`"ace"`
解释:因为 `"ace"` 是 `s1` 和 `s2` 的最长公共子序列。
def longestCommonSubsequence(s1, s2): """ Given two strings, find their longest common subsequence. Args: s1 (str): The first string. s2 (str): The second string. Returns: str: The longest common subsequence. """ m, n = len(s1), len(s2) # Get the lengths of the two strings dp = [[0] * (n +1) for _ in range(m +1)] # Create a2D array to store the lengths of common subsequences for i in range(1, m +1): for j in range(1, n +1): if s1[i -1] == s2[j -1]: # If the current characters are equal, update the length of the common subsequence dp[i][j] = dp[i -1][j -1] +1 else: # Otherwise, take the maximum length from the previous row or column dp[i][j] = max(dp[i -1][j], dp[i][j -1]) # Reconstruct the longest common subsequence from the2D array lcs = [] i, j = m, n while i >0 and j >0: if s1[i -1] == s2[j -1]: lcs.append(s1[i -1]) i -=1 j -=1 elif dp[i -1][j] > dp[i][j -1]: i -=1 else: j -=1 return "".join(reversed(lcs))
### 二、设计题#### 题目1:设计一个缓存系统设计一个缓存系统,能够存储和检索整数值。该系统应该支持以下操作:
* `put(int key, int value)`:将给定的键值对添加到缓存中。
* `get(int key)`:返回给定键的值,如果不存在,则返回 `-1`。
**示例1:**
输入:`["put","get"]`
输出:`[null,-1]`
解释:首先,调用 `put(1,1)` 将 (1,1) 添加到缓存中。然后,调用 `get(1)` 返回1,因为它存在于缓存中。
**示例2:**
输入:`["put","get","put","get"]`
输出:`[null,1,null,-1]`
解释:首先,调用 `put(1,1)` 将 (1,1) 添加到缓存中。然后,调用 `get(1)` 返回1,因为它存在于缓存中。接着,调用 `put(2,2)` 将 (2,2) 添加到缓存中。最后,调用 `get(1)` 返回 -1,因为它不存在于缓存中。
class Node: def __init__(self): self.key = None self.value = None self.prev = None self.next = Noneclass LRUCache: def __init__(self, capacity: int): """ Initialize the LRU Cache. Args: capacity (int): The maximum size of the cache. """ self.capacity = capacity self.cache = {} self.head = Node() self.tail = Node() # Connect the head and tail nodes self.head.next = self.tail self.tail.prev = self.head def put(self, key: int, value: int) -> None: """ Add a new key-value pair to the cache. Args: key (int): The key. value (int): The value. """ if key in self.cache: # If the key already exists, remove it from its current position node = self.cache[key] self._remove(node) # Create a new node for the key-value pair node = Node() node.key = key node.value = value # Add the new node to the end of the cache self._add(node) self.cache[key] = node def get(self, key: int) -> int: """ Retrieve a value from the cache. Args: key (int): The key. Returns: int: The value if it exists in the cache; otherwise, -1. """ if key in self.cache: # If the key exists, move its node to the end of the cache node = self.cache[key] self._remove(node) self._add(node) return node.value return -1 def _remove(self, node: Node) -> None: """ Remove a node from the cache. Args: node (Node): The node to remove. """ prev_node = node.prev next_node = node.next # Update the pointers of the adjacent nodes prev_node.next = next_node next_node.prev = prev_node def _add(self, node: Node) -> None: """ Add a node to the end of the cache. Args: node (Node): The node to add. """ prev_node = self.tail.prev prev_node.next = node node.prev = prev_node node.next = self.tail# Example usage: cache = LRUCache(2) cache.put(1,1) print(cache.get(1)) # Output:1cache.put(2,2) print(cache.get(1)) # Output: -1
### 三、系统设计题#### 题目1:设计一个分布式缓存系统设计一个分布式缓存系统,能够存储和检索整数值。该系统应该支持以下操作:
* `put(int key, int value)`:将给定的键值对添加到缓存中。
* `get(int key)`:返回给定键的值,如果不存在,则返回 `-1`。
**示例1:**
输入:`["put","get"]`
输出:`[null,-1]`
解释:首先,调用 `put(1,1)` 将 (1,1) 添加到缓存中。然后,调用 `get(1)` 返回1,因为它存在于缓存中。
**示例2:**
输入:`["put","get","put","get"]`
输出:`[null,1,null,-1]`
解释:首先,调用 `put(1,1)` 将 (1,1