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() 去除首尾空白字符