SWE · OA / Coding

Meta 大小写数量差:ASCII与有符号结果

统计大写和小写字母数量差,明确字符分类、符号方向与非字母处理。

题目重点:统计大写和小写字母数量差,明确字符分类、符号方向与非字母处理。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练只计ASCII A..Z/a..z,默认uppercase−lowercase;absolute=True返回绝对差。题目未明确差的方向,因此练习前确认是否取绝对值。
  • 数字/标点/其他Unicode忽略;如果要求Unicode大小写,需要改分类合同,不能自动将中文当小写。

解题路线

  1. 一次扫描,大写加1、小写减1,其他0,即difference=sum每字符贡献。无需存两个字符列表,计数整数足够。
  2. 有符号与绝对差在最后处理:不断对部分差abs会丢失方向,不能与最终abs交换。空串0,只有小写则signed为负。
  3. ASCII区间比较与str.isupper/islower不同,后者会计入其他文字;函数名不能替代字符域定义。
  4. 流式文件处理保持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映射可能多字符,按码点还是转换后长度怎样定?
✓已复制微信号!