题目重点:统计大写和小写字母数量差,明确字符分类、符号方向与非字母处理。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练只计ASCII A..Z/a..z,默认uppercase−lowercase;absolute=True返回绝对差。题目未明确差的方向,因此练习前确认是否取绝对值。
- 数字/标点/其他Unicode忽略;如果要求Unicode大小写,需要改分类合同,不能自动将中文当小写。
解题路线
- 一次扫描,大写加1、小写减1,其他0,即difference=sum每字符贡献。无需存两个字符列表,计数整数足够。
- 有符号与绝对差在最后处理:不断对部分差abs会丢失方向,不能与最终abs交换。空串0,只有小写则signed为负。
- ASCII区间比较与str.isupper/islower不同,后者会计入其他文字;函数名不能替代字符域定义。
- 流式文件处理保持difference跨块累加,绝对值在全部块结束后计算。不能各块abs后相加,那不等于全局绝对差。
手动走一遍
AaZb为0,ABCd为2,abc signed−3/absolute3;é不在ASCII合同内不计。块ABC与def各绝对3相加6,但全局绝对差0。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
def case_difference(text,absolute=False):
"""ASCII only; uppercase-lowercase signed by default, other characters ignored."""
difference=0
for ch in text:
if 'A'<=ch<='Z':difference+=1
elif 'a'<=ch<='z':difference-=1
return abs(difference) if absolute else difference
复杂度
O(N)时间/O(1)辅助状态,扫描所有字符以免最后字符改变答案。Unicode归一化另计预处理成本与locale规则,不能直接套固定ASCII证明。
易错点与追问
容易失分的边界
- 未确认符号方向却用abs掩盖区别。
- 对每个块先abs失去跨块抵消。
继续深挖
- 返回两个数量时保存两个counter,输出合同不同。
- Unicode映射可能多字符,按码点还是转换后长度怎样定?
