题目重点:看似一行的题也要明确整数合同、流式输出、负余数与输入解析。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 题目要求给定integer list输出全部odd,明确追问negative及超过32bit;本文保留顺序、重复,每值一行,具体输出格式题目未明确。
- Python整数是任意精度,示例拒绝bool及非int;原面试语言未给,不能将Python处理能力说成所有语言自动成立。
- 流式边读边输出,若后面有非法元素会已有部分输出;全列表原子成功是另一合同,需先校验或缓冲。
解题路线
- 奇数定义是不能整除2,即x%2 != 0。不要用x%2 == 1作为跨语言解释:某些语言负奇数余数为−1。Python负数取模合同下==1成立,但!=0表达整除性质更通用。
- Python源码已拿到integer list,超32位不会溢出;若输入来自字符串,选择语言的任意精度整数解析。Java用BigInteger而不是先parseInt,JavaScript若需精确超安全整数需BigInt,不能先Number丢精度再转换。
- 用生成器逐个筛选,打印边界通过注入text stream便于核输出顺序/格式。输入[-3,−2,−1,0,1,1,2]输出−3,−1,1,1,不排序去重。负数取绝对值不是必要步骤,也可能在定宽最小负数时溢出。
- 巨大数字输出成本不再常量:筛选整数最低位很便宜,十进制转换和IO受位宽/字符数影响。数据海量时批缓冲避免每行系统调用,但缓冲上限与失败后输出合同须说清。
- 验证用x与2·floor(x/2)关系作独立奇偶参考,并核实际输出文本;附2^256量级正负、bool拒绝。不会为了打印奇数引入不必要排序/哈希。
手动走一遍
[-(2^256+1),2^256,2^256+1]输出第1与第3值。若在32位容器中事先截断数据,之后再转大整数已无法恢复;应在解析/存储入口保留原始值。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
def odd_values(values):
"""Preserve input order and repetitions; reject bool despite int subclassing."""
for value in values:
if type(value) is not int:
raise TypeError('expected arbitrary-precision integer')
if value % 2 != 0:
yield value
def print_odds(values, output):
# output is a text stream, so the exercise can be tested without stdout capture.
for value in odd_values(values):
print(value, file=output)
复杂度
n元素基本扫描O(n),工作空间O(1)不含整数与输出缓冲;总输出至少O(字符数),任意精度数值操作和字符串化另计位宽。
易错点与追问
容易失分的边界
- 负余数等于1假设跨语言成立。
- 输入先解析成32位。
- 去重改变输出。
- Python bool当普通题目整数。
- 流式失败误称输出原子性。
继续深挖
- 如果输入文本超百万位怎样限资源?
- 定宽语言不用abs怎样判负奇数?
- 需要原子输出时怎样变合同?
- JSON跨语言传大整数怎样不丢精度?
