HackerRank OA 常见题型全解析(2026 更新):5 大必考题型与解题模板
HackerRankOAcodingalgorithmdynamic-programminggraphsliding-windowtwo-pointers

HackerRank OA 常见题型全解析(2026 更新):5 大必考题型与解题模板

HackerRank 是最常用的在线评估平台,Meta、Uber、Netflix、Pinterest 等大厂都在用。本文总结五大必考题型,提供解题模板和实战技巧。

Sam · · 15 分钟阅读

HackerRank 是北美科技公司最常用的在线评估平台之一。Meta、Uber、Netflix、Pinterest、Shopify 等大厂都用它来做 OA。

跟 CodeSignal 不同,HackerRank 的 OA 通常是自定义题目,难度覆盖 Easy 到 Hard,更侧重考察实际编码能力而非刷题经验。

HackerRank OA 常见结构

  • 1-2 道编程题:30-60 分钟
  • 语言自由:支持 Python、Java、C++、JavaScript 等
  • 在线 IDE:可以直接运行和调试
  • 隐藏测试用例:提交后看通过率

题型一:字符串处理与模式匹配

典型题目

题目:给定一个文本字符串和一个模式字符串,找出所有匹配的位置。

def find_all_patterns(text: str, pattern: str) -> list[int]:
    """Rabin-Karp 算法找所有匹配位置"""
    if not pattern or not text or len(pattern) > len(text):
        return []
    
    n, m = len(text), len(pattern)
    BASE = 26
    MOD = 10**9 + 7
    
    # 计算 pattern 的 hash
    pattern_hash = 0
    text_hash = 0
    power = pow(BASE, m - 1, MOD)
    
    for i in range(m):
        pattern_hash = (pattern_hash * BASE + ord(pattern[i])) % MOD
        text_hash = (text_hash * BASE + ord(text[i])) % MOD
    
    results = []
    for i in range(n - m + 1):
        if text_hash == pattern_hash:
            # 验证(处理 hash collision)
            if text[i:i+m] == pattern:
                results.append(i)
        
        if i < n - m:
            text_hash = ((text_hash - ord(text[i]) * power) * BASE + ord(text[i + m])) % MOD
    
    return results

关键技巧

  • 暴力解法 O(N*M),Rabin-Karp 平均 O(N+M)
  • 注意 hash collision 处理
  • 边界条件:空字符串、模式比文本长

题型二:动态规划

典型题目

题目:最长递增子序列(LIS)的变种——给定数组,求最长 wiggle subsequence 的长度。

def wiggle_subsequence(nums: list[int]) -> int:
    if len(nums) < 2:
        return len(nums)
    
    # up[i] 表示以第 i 个元素结尾,最后一步是上升的 wiggle 长度
    # down[i] 表示以第第 i 个元素结尾,最后一步是下降的 wiggle 长度
    up = 1
    down = 1
    
    for i in range(1, len(nums)):
        if nums[i] > nums[i - 1]:
            up = down + 1
        elif nums[i] < nums[i - 1]:
            down = up + 1
        # 相等则不更新
    
    return max(up, down)

动态规划通用框架

def dp_template(nums):
    n = len(nums)
    dp = [0] * n
    
    # 1. 定义状态
    # dp[i] = 以第 i 个元素结尾的 xxx
    
    # 2. 初始化
    dp[0] = 1  # base case
    
    # 3. 状态转移
    for i in range(1, n):
        for j in range(i):
            if condition(nums[i], nums[j]):
                dp[i] = max(dp[i], dp[j] + 1)
    
    # 4. 返回答案
    return max(dp)

题型三:图论与搜索

典型题目

题目:岛屿数量 + 连通分量统计

from collections import deque

def num_islands(grid: list[list[str]]) -> int:
    if not grid:
        return 0
    
    rows, cols = len(grid), len(grid[0])
    count = 0
    
    def bfs(r, c):
        queue = deque([(r, c)])
        grid[r][c] = '0'  # 标记为已访问
        
        while queue:
            row, col = queue.popleft()
            for dr, dc in [(0,1), (0,-1), (1,0), (-1,0)]:
                nr, nc = row + dr, col + dc
                if 0 <= nr < rows and 0 <= nc < cols and grid[nr][nc] == '1':
                    grid[nr][nc] = '0'
                    queue.append((nr, nc))
    
    for i in range(rows):
        for j in range(cols):
            if grid[i][j] == '1':
                bfs(i, j)
                count += 1
    
    return count

图论常见模板

题型算法时间复杂度
最短路径(无权)BFSO(V+E)
最短路径(有权)DijkstraO(E log V)
拓扑排序Kahn’s / DFSO(V+E)
连通分量Union-Find / BFSO(V+E)
最小生成树Kruskal / PrimO(E log V)

题型四:滑动窗口与双指针

典型题目

题目:给定一个整数数组和值 k,找出数组中至少包含 k 个偶数的最短子数组长度。

def shortest_subarray_with_k_evens(nums: list[int], k: int) -> int:
    if k == 0:
        return 0
    
    left = 0
    even_count = 0
    result = float('inf')
    
    for right in range(len(nums)):
        if nums[right] % 2 == 0:
            even_count += 1
        
        while even_count >= k:
            result = min(result, right - left + 1)
            if nums[left] % 2 == 0:
                even_count -= 1
            left += 1
    
    return result if result != float('inf') else -1

滑动窗口框架

def sliding_window_template(s, target):
    left = 0
    window = {}
    result = float('inf')
    
    for right in range(len(s)):
        # 1. 添加 right 元素到窗口
        add_to_window(s[right], window)
        
        # 2. 满足条件时收缩窗口
        while is_valid(window, target):
            result = update_result(result, left, right)
            # 移除 left 元素
            remove_from_window(s[left], window)
            left += 1
    
    return result

题型五:排序与哈希

典型题目

题目:数组中两数之和等于目标值的所有不重复组合。

from collections import Counter

def two_sum_all_pairs(nums: list[int], target: int) -> list[list[int]]:
    count = Counter(nums)
    result = set()
    
    for num in count:
        complement = target - num
        if complement in count:
            if num != complement:
                result.add((min(num, complement), max(num, complement)))
            elif count[num] >= 2:
                result.add((num, num))
    
    return [list(pair) for pair in sorted(result)]

实战技巧

1. 先跑通样例再优化

HackerRank 允许你在提交前运行自定义测试用例,确保基础逻辑正确再考虑边界情况和性能优化。

2. 善用内置库

# 排序
sorted_list = sorted(arr, key=lambda x: (x[1], -x[0]))

# Counter 统计频率
from collections import Counter
freq = Counter(nums)

# deque 做双端队列
from collections import deque
dq = deque()
dq.appendleft(x)

# heap 做优先队列
import heapq
heapq.heappush(heap, (priority, value))

3. 时间复杂度意识

数据规模允许的复杂度
N ≤ 10^3O(N²)
N ≤ 10^5O(N log N)
N ≤ 10^7O(N)

FAQ

HackerRank 和 CodeSignal 有什么区别?

HackerRank 通常是自定义题目,CodeSignal 有标准题库。HackerRank 更灵活,CodeSignal 更标准化。

可以用 IDE 提示吗?

HackerRank 的在线 IDE 有基础自动补全,但不支持外部 IDE。

通过率多少算过?

没有统一标准,但通常要求 70%+ 的测试用例通过,且时间复杂度在限制内。


💡 需要面试辅导?

如果你对准备技术面试感到迷茫,或者想要个性化的面试指导和简历优化,欢迎联系 Interview Coach Pro 获取一对一辅导服务。

👉 联系我们 获取专属面试准备方案

准备好拿下下一次面试了吗?

获取针对你的目标岗位和公司的个性化辅导方案。

联系我们