题目描述
思路解析动画文字版
记住这把尺子:大写小写在 ASCII 表里成对排列,每对正好差 32。下面每一帧都在套「在范围就 +32,不在就放过」。
先把整条串摆出来。大写字母 A、C、E、G、I 夹在小写 b、d、f、h、j 中间。我们从第 0 个开始,一个一个过。
轮到第 0 个字符 「A」,它的 ASCII 码是 65。先问:这个码落在 65 到 90 之间吗,也就是它是不是大写字母?
「A」 是大写,该转。给它的码 65 加上 32(用位运算 | 32 一步到位)得到 97,也就是小写 「a」。第 0 格变绿,表示这一格已经转好了。
轮到第 1 个字符 「b」,它的 ASCII 码是 98。先问:这个码落在 65 到 90 之间吗,也就是它是不是大写字母?
「b」 的码 98 不在 65 到 90 这一段,它本来就是小写,什么都不用做,原样留下。第 1 格标蓝,表示看过、未改。
轮到第 2 个字符 「C」,它的 ASCII 码是 67。先问:这个码落在 65 到 90 之间吗,也就是它是不是大写字母?
「C」 是大写,该转。给它的码 67 加上 32(用位运算 | 32 一步到位)得到 99,也就是小写 「c」。第 2 格变绿,表示这一格已经转好了。
轮到第 3 个字符 「d」,它的 ASCII 码是 100。先问:这个码落在 65 到 90 之间吗,也就是它是不是大写字母?
「d」 的码 100 不在 65 到 90 这一段,它本来就是小写,什么都不用做,原样留下。第 3 格标蓝,表示看过、未改。
轮到第 4 个字符 「E」,它的 ASCII 码是 69。先问:这个码落在 65 到 90 之间吗,也就是它是不是大写字母?
「E」 是大写,该转。给它的码 69 加上 32(用位运算 | 32 一步到位)得到 101,也就是小写 「e」。第 4 格变绿,表示这一格已经转好了。
轮到第 5 个字符 「f」,它的 ASCII 码是 102。先问:这个码落在 65 到 90 之间吗,也就是它是不是大写字母?
「f」 的码 102 不在 65 到 90 这一段,它本来就是小写,什么都不用做,原样留下。第 5 格标蓝,表示看过、未改。
轮到第 6 个字符 「G」,它的 ASCII 码是 71。先问:这个码落在 65 到 90 之间吗,也就是它是不是大写字母?
「G」 是大写,该转。给它的码 71 加上 32(用位运算 | 32 一步到位)得到 103,也就是小写 「g」。第 6 格变绿,表示这一格已经转好了。
轮到第 7 个字符 「h」,它的 ASCII 码是 104。先问:这个码落在 65 到 90 之间吗,也就是它是不是大写字母?
「h」 的码 104 不在 65 到 90 这一段,它本来就是小写,什么都不用做,原样留下。第 7 格标蓝,表示看过、未改。
轮到第 8 个字符 「I」,它的 ASCII 码是 73。先问:这个码落在 65 到 90 之间吗,也就是它是不是大写字母?
「I」 是大写,该转。给它的码 73 加上 32(用位运算 | 32 一步到位)得到 105,也就是小写 「i」。第 8 格变绿,表示这一格已经转好了。
轮到第 9 个字符 「j」,它的 ASCII 码是 106。先问:这个码落在 65 到 90 之间吗,也就是它是不是大写字母?
「j」 的码 106 不在 65 到 90 这一段,它本来就是小写,什么都不用做,原样留下。第 9 格标蓝,表示看过、未改。
十个字符全部过了一遍。绿色的 5 个是从大写转来的,蓝色的 5 个本就是小写、原样保留,拼起来就是答案 abcdefghij。整个过程一遍扫描、没有回头。
三种极端:全小写不动、全大写全转、单字符。先在脑子里跑一遍最稳。
两个高频追问,核心是讲清「差 32 的那一位比特」。
参考代码
from __future__ import annotationsfrom typing import *from collections import *from functools import *from itertools import *from math import *from heapq import *from bisect import *class Solution: def toLowerCase(self, s: str) -> str: return "".join([chr(ord(c) | 32) if c.isupper() else c for c in s])复杂度
- 时间:O(n),每个字符只看一次,n 是串长
- 空间:O(n),需要一个等长的结果串(字符串通常不可原地改);C++ 传值副本上原地改也是 O(n)
易错点
面试追问把动画讲成自己的话
追问为什么大写转小写可以用位运算 | 32?
追问如果不让用库函数 tolower,怎么写最稳?
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
宝石与石头
LeetCode 771 · 简单 · 沿着 数组套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题