- 题目描述:给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。
-
示例:
输入:s = “Hello”
输出:“hello”
输入:s = “LOVELY”
输出:“lovely” - 题目解析,这是一个灰常简单的题目,准确的说一句代码就能完事,如下:
class Solution:
def toLowerCase(self, s: str) -> str:
return s.lower()
那么我为什么还要记下这个题目呢,因为这个题目虽然一句代码就能完成,但是他是基于python自带的字符串函数lower()完成,如果不适用这个函数呢?这样,这个题目就变得有意思起来了。首先我们要知道,python里面的各个字符都是ASCII编码或者Unicode 编码,一般来说,小写字母和大写字母都是ASCII编码,也就是说每一个小写字母和大写字母都对应着一个编码-一个数值,那么我们掌握了这个数值的分布规律是不是就能摆脱对这个python内置函数lower()的依赖呢?答案是肯定的。
首先介绍一下两个函数,分别是ord和chr。chr函数很好理解,他是char的缩写,意思是将给定的数字编码转换为对应的字符。
- 举个栗子:
ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值。 - 举个栗子:
好了背景知识以及介绍完了,现在进入正题,其实上述的栗子已经突出主题了,我们可以发现A-Z对应的ASCII编码是65-90,而a-z对应的ASCII编码是97-122,即相同字母的大小写相差32,举个栗子,如下。
因此到这里,我们的新解题思路就出来了。 - 如果我们要把一个大写字母转化为小写:
if 65<=ord(word)<=90:
print(chr(ord(word)+32))
- 同理,如果我们要把一个小写字母转化为大写:
if 97<=ord(word)<=122:
print(chr(ord(word)-32))
- 那么这个题目的另一种方法,也不叫另外一种方法吧,lower()方法的底层实现解法是:
class Solution:
def toLowerCase(self, s: str) -> str:
"""
将一个字符串的大写字母转换为相同的小写字母
>>>self.toLowerCase("Hello")
>>>"hello"
"""
ans = ''
for c in s:
if 65<=ord(c)<=90:
ans += chr(ord(c)+32)
else:
ans += c
return ans