Easy

题目描述

给你一个字符串 s ,将每个大写字母替换为相同的小写字母,返回新的字符串。

示例 1:

输入:s = "Hello"
输出:"hello"

示例 2:

输入:s = "here"
输出:"here"

示例 3:

输入:s = "LOVELY"
输出:"lovely"

约束条件:

  • 1 <= s.length <= 100
  • s 由可打印的 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

解法思路:

  1. 方法一(推荐): 遍历字符串,对于每个字符,判断是否为大写字母(ASCII 码在 65-90 范围内),如果是则加上 32 转为小写
  2. 方法二: 使用内置的字符转换函数,但这不是题目的本意

实现要点:

  • 判断大写字母:c >= 'A' && c <= 'Z'
  • 转换为小写:c + 32c - '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)

相关题目