跳转至

552_在线编程面试平台使用


一句话说明

在线编程面试平台(HackerRank/LeetCode/牛客等)有独特的环境限制和使用技巧,提前熟悉能减少不必要的失误。


核心知识点

常见面试平台

平台用途特点
LeetCode算法刷题/面试题库最全,国际通用
HackerRank企业笔试需要处理输入/输出
牛客网国内企业笔试类似HackerRank
Codility欧美企业时间压力大
CoderPad技术面试可实时运行,面试官可见
GitHub Copilot考试少数企业允许AI辅助

HackerRank/牛客注意事项

与 LeetCode 最大区别:需要自己处理输入输出!

LeetCode 模式(给你函数,直接写实现):
def solve(nums: list[int]) -> int:
    # 直接写逻辑
    ...

HackerRank 模式(从stdin读输入,stdout输出):
import sys
n = int(input())              # 读整数
line = input().split()       # 读一行,按空格分割
nums = list(map(int, line))  # 转成整数列表
print(answer)                # 输出结果

实战代码/设计图/模板

HackerRank 输入处理模板

import sys
input = sys.stdin.readline  # 比input()快

def solve():
    # 常见输入格式1:先读n,再读n个数
    n = int(input())
    nums = list(map(int, input().split()))

    # 常见输入格式2:多行输入
    t = int(input())  # t组测试用例
    for _ in range(t):
        a, b = map(int, input().split())
        print(a + b)

    # 常见输入格式3:读到EOF
    for line in sys.stdin:
        parts = line.strip().split()
        # 处理每行

solve()

生信相关的 HackerRank 题型

# 题目:给N个DNA序列,统计每个序列的GC含量
# 输入:
# 3
# ATCG
# GCGC
# ATAT
# 输出:
# 50.0
# 100.0
# 0.0

import sys
input = sys.stdin.readline

def gc_content(dna: str) -> float:
    """计算GC含量百分比"""
    if not dna:
        return 0.0
    gc = dna.count('G') + dna.count('C')
    return gc / len(dna) * 100

def main():
    n = int(input())
    for _ in range(n):
        dna = input().strip()
        print(f"{gc_content(dna):.1f}")

main()
# 题目:k-mer计数(生信经典题)
# 给定DNA序列和k值,输出所有长度k的子串及其出现次数
# 输入:AATCAATG 3
# 输出:
# AAT 2
# ATC 1
# TCA 1
# CAA 1
# ATG 1

from collections import Counter

def count_kmers(dna: str, k: int) -> dict:
    """统计所有k-mer出现次数"""
    kmers = [dna[i:i+k] for i in range(len(dna) - k + 1)]
    return dict(Counter(kmers))

def main():
    line = input().split()
    dna, k = line[0], int(line[1])

    kmer_counts = count_kmers(dna, k)
    for kmer in sorted(kmer_counts.keys()):
        print(f"{kmer} {kmer_counts[kmer]}")

main()

CoderPad 注意事项(面试官实时看)

# CoderPad 技巧:
# 1. 先写一个能跑的解,再优化
# 2. 加上测试用例,展示你会测试
# 3. 用注释说明思路

def find_common_genes(list1: list[str], list2: list[str]) -> list[str]:
    """
    找两个样本共有的基因
    思路:用 set 交集,O(n+m)
    """
    # 先暴力解:双重循环 O(n*m)
    # result = [g for g in list1 if g in list2]

    # 优化解:set 交集 O(n+m)
    return sorted(set(list1) & set(list2))

# 测试用例(面试时主动写,展示测试习惯)
if __name__ == "__main__":
    # 基本情况
    assert find_common_genes(["BRCA1","TP53","MYC"], ["TP53","EGFR"]) == ["TP53"]
    # 空列表
    assert find_common_genes([], ["TP53"]) == []
    # 无交集
    assert find_common_genes(["BRCA1"], ["TP53"]) == []
    print("所有测试通过!")

Python 竞赛常用加速技巧

import sys
from functools import lru_cache
from collections import defaultdict, Counter, deque

# 1. 快速输入(IO密集题)
input = sys.stdin.readline

# 2. 一次读所有输入
data = sys.stdin.read().split()
idx = 0
n = int(data[idx]); idx += 1

# 3. 快速输出(减少print调用)
results = []
results.append(str(answer))
print('\n'.join(results))

# 4. 递归深度限制
sys.setrecursionlimit(10**6)

# 5. 记忆化(避免重复计算)
@lru_cache(maxsize=None)
def dp(i, j):
    if i == 0: return j
    if j == 0: return i
    return min(dp(i-1, j) + 1, dp(i, j-1) + 1, dp(i-1, j-1) + (s1[i-1] != s2[j-1]))

面试常问点

问题建议
超时了怎么办?检查是否有O(n²)可以优化到O(n)
内存超了怎么办?用生成器代替列表,避免中间结果
运行时错误?先检查边界:索引越界、除零、None
平台不支持某库?不同平台支持的库不同,提前确认
测试用例过了但提交失败?隐藏测试有特殊边界,加强防御性编程

速查表

常用Python标准库(不需要import说明):
  collections: Counter, defaultdict, deque, OrderedDict
  itertools: combinations, permutations, product, chain
  heapq: heappush, heappop(最小堆)
  bisect: bisect_left, bisect_right(二分插入)
  functools: lru_cache, reduce
  math: gcd, lcm, sqrt, log, ceil, floor

HackerRank常见坑:
  - 最后一行可能没有换行
  - 整数可能有前导空格
  - 答案要完全匹配(多余空格会WA)
  - 用 strip() 去除首尾空白字符