leetcode
leetcode 651 ~ 700
转换成小写字母

转换成小写字母

难度:

标签:

题目描述

代码结果

运行时间: 18 ms, 内存: 15.8 MB


// 使用Java Stream的题解代码和注释
 
// 思路:
// 1. 使用String.chars()方法将字符串转换为IntStream。
// 2. 对每个字符进行映射,将大写字母转换为小写字母。
// 3. 使用Collectors.collectingAndThen来收集结果并构建新的字符串。
 
import java.util.stream.Collectors;
 
public class Solution {
    public String toLowerCase(String s) {
        return s.chars()
                 .mapToObj(c -> (char) (c >= 'A' && c <= 'Z' ? c + ('a' - 'A') : c))
                 .collect(Collectors.collectingAndThen(Collectors.toList(), list -> {
                     StringBuilder sb = new StringBuilder(list.size());
                     list.forEach(sb::append);
                     return sb.toString();
                 }));
    }
}
 

解释

方法:

该题解采用逐字符检查的方式来将字符串中的所有大写字母转换成小写字母。具体方法是遍历字符串中的每一个字符,并检查其ASCII码值。如果字符是大写字母(ASCII码在65到90之间),则将其转换为小写字母,即在其ASCII码值上加32(因为大写字母与对应的小写字母之间的ASCII差为32)。如果字符不是大写字母,则直接保留。所有处理过的字符被存储在一个列表中,最后使用join方法将列表中的字符合并成一个新的字符串。

时间复杂度:

O(n)

空间复杂度:

O(n)

代码细节讲解

🦆
在ASCII码转换过程中,你是如何处理非英文字母字符的?
在给定的算法中,非英文字母字符未被单独处理,因为它们的ASCII码值不会在大写字母的ASCII码范围(65到90)之内。因此,当遇到这些字符时,算法会直接将它们添加到结果列表中,不做任何改变。这样保证了非英文字母字符在转换过程中保持不变。
🦆
为什么选择使用列表来存储转换后的字符,而不是直接操作原字符串?
在Python中,字符串是不可变的,这意味着字符串一旦创建,其内容就不能被修改。直接在原字符串上修改会引发错误或需要不断创建和销毁字符串,这在性能上是低效的。使用列表来存储字符允许我们动态地添加和修改字符,最后通过使用join方法将它们合并成一个新的字符串。这种方法比直接修改字符串更高效,尤其是在处理大规模数据时。
🦆
你提到使用ASCII值来判断和转换字母,这种方法对于非ASCII编码的字符集如何处理?
本算法主要针对ASCII字符集设计,对于非ASCII编码的字符集,如UTF-8中的多字节字符,这种方法可能无法正确处理。非ASCII字符的处理需要其他技术或方法,如在Python中可以使用内建的字符串方法str.lower()来处理所有类型的字符,这个方法能够自动识别并正确处理各种语言和符号,包括非ASCII字符。

相关问题