Easy
题目描述
给你一个字符串 s ,将每个大写字母替换为相同的小写字母,返回新的字符串。
示例 1:
输入:s = "Hello"
输出:"hello"
示例 2:
输入:s = "here"
输出:"here"
示例 3:
输入:s = "LOVELY"
输出:"lovely"
约束条件:
1 <= s.length <= 100s由可打印的 ASCII 字符组成
提示:
- 大多数语言都支持字符串数据类型的小写转换。然而,这肯定不是这个问题的目的。想想小写函数调用的实现如何能够轻松完成。
- 想想 ASCII!
- 想想不同的大写字母及其 ASCII 码,以及它们与小写字母的关系。那里似乎有什么模式吗?我们可以使用什么数学关系?
解题思路
解题思路
这道题的核心是理解 ASCII 码的规律。在 ASCII 码表中,大写字母 A-Z 的码值范围是 65-90,小写字母 a-z 的码值范围是 97-122。
关键发现: 每个大写字母和对应小写字母的 ASCII 码值相差 32。例如:
- ‘A’ = 65, ‘a’ = 97, 差值 = 32
- ‘B’ = 66, ‘b’ = 98, 差值 = 32
解法思路:
- 方法一(推荐): 遍历字符串,对于每个字符,判断是否为大写字母(ASCII 码在 65-90 范围内),如果是则加上 32 转为小写
- 方法二: 使用内置的字符转换函数,但这不是题目的本意
实现要点:
- 判断大写字母:
c >= 'A' && c <= 'Z' - 转换为小写:
c + 32或c - 'A' + 'a' - 只处理大写字母,其他字符保持不变
算法流程简单直观,时间复杂度为 O(n),空间复杂度根据语言特性而定。
代码实现
class Solution {
public:
string toLowerCase(string s) {
for (int i = 0; i < s.length(); i++) {
if (s[i] >= 'A' && s[i] <= 'Z') {
s[i] = s[i] + 32;
}
}
return s;
}
};
class Solution:
def toLowerCase(self, s: str) -> str:
result = ""
for c in s:
if 'A' <= c <= 'Z':
result += chr(ord(c) + 32)
else:
result += c
return result
public class Solution {
public string ToLowerCase(string s) {
char[] chars = s.ToCharArray();
for (int i = 0; i < chars.Length; i++) {
if (chars[i] >= 'A' && chars[i] <= 'Z') {
chars[i] = (char)(chars[i] + 32);
}
}
return new string(chars);
}
}
var toLowerCase = function(s) {
let result = "";
for (let i = 0; i < s.length; i++) {
let c = s[i];
if (c >= 'A' && c <= 'Z') {
result += String.fromCharCode(c.charCodeAt(0) + 32);
} else {
result += c;
}
}
return result;
};
复杂度分析
| 复杂度类型 | 分析 |
|---|---|
| 时间复杂度 | O(n),需要遍历字符串中的每个字符 |
| 空间复杂度 | O(1) 到 O(n),取决于语言特性:C++ 原地修改为 O(1),Python/JavaScript 创建新字符串为 O(n) |
相关题目
- . Capitalize the Title (Easy)