interview 面试 在线编程面试平台使用 一句话说明 在线编程面试平台(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() 去除首尾空白字符