牛客网:华为机试刷题记录
发布人:shili8
发布时间:2025-01-30 16:44
阅读次数:0
**华为机试刷题记录**
作为一名正在努力提升编程能力的程序员,我决定在牛客网上进行华为机试刷题。以下是我的刷题记录,包括部分代码示例和注释。
**第一题:最长公共子序列**
题目描述:给定两个字符串 `s1` 和 `s2`,找到它们的最长公共子序列(LCS)。
def longest_common_subsequence(s1, s2): m = len(s1) +1 n = len(s2) +1 # 创建一个二维数组来存储每个子问题的结果 dp = [[0] * n for _ in range(m)] # 初始化第一行和第一列 for i in range(1, m): dp[i][0] =0 for j in range(1, n): dp[0][j] =0 # 填充二维数组 for i in range(1, m): for j in range(1, n): if s1[i -1] == s2[j -1]: dp[i][j] = dp[i -1][j -1] +1 else: dp[i][j] = max(dp[i -1][j], dp[i][j -1]) # 回溯找到LCS lcs = [] i, j = m -1, n -1 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))
**第二题:最小生成树**
题目描述:给定一个带权图,找到其最小生成树。
import networkx as nxdef minimum_spanning_tree(graph): # 使用Prim算法找到最小生成树 mst = nx.minimum_spanning_tree(graph) return mst.edges()
**第三题:滑动窗口**
题目描述:给定一个数组和一个窗口大小,求出所有可能的滑动窗口。
def sliding_window(arr, window_size): # 使用列表推导式生成所有可能的滑动窗口 windows = [arr[i:i + window_size] for i in range(len(arr) - window_size +1)] return windows
**第四题:二分查找**
题目描述:给定一个有序数组和一个目标值,使用二分查找找到其索引。
def binary_search(arr, target): # 使用二分查找算法找到目标值的索引 left, right =0, len(arr) -1 while left <= right: mid = (left + right) //2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid +1 else: right = mid -1 return -1
**第五题:回文链表**
题目描述:给定一个单链表,判断是否为回文链表。
class ListNode: def __init__(self, x): self.val = x self.next = Nonedef is_palindrome(head): # 使用快慢指针找到链表的中点 slow, fast = head, head while fast and fast.next: slow = slow.next fast = fast.next.next # 将后半段反转 prev = None while slow: next_node = slow.next slow.next = prev prev = slow slow = next_node # 比较前后两半是否相等 p1, p2 = head, prev while p2: if p1.val != p2.val: return False p1 = p1.next p2 = p2.next return True
以上是我的华为机试刷题记录,包括部分代码示例和注释。希望这些代码能够帮助你更好地理解编程概念,并且能够在实际项目中应用这些知识。