字符串题目:转换成小写字母

文章目录

题目

标题和出处

标题:转换成小写字母

出处:709. 转换成小写字母

难度

1 级

题目描述

要求

给你一个字符串 s \texttt{s} s,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。

示例

示例 1:

输入: s   =   "Hello" \texttt{s = "Hello"} s = "Hello"
输出: "hello" \texttt{"hello"} "hello"

示例 2:

输入: s   =   "here" \texttt{s = "here"} s = "here"
输出: "here" \texttt{"here"} "here"

示例 3:

输入: s   =   "LOVELY" \texttt{s = "LOVELY"} s = "LOVELY"
输出: "lovely" \texttt{"lovely"} "lovely"

数据范围

  • 1 ≤ s.length ≤ 100 \texttt{1} \le \texttt{s.length} \le \texttt{100} 1≤s.length≤100
  • s \texttt{s} s 由 ASCII 字符集中的可打印字符组成

解法

思路和算法

这道题目要求将给定的字符串 s s s 中的大写字母转换成相同的小写字母,返回新的字符串。解法非常直观,遍历字符串 s s s,判断每个字符是否是大写字母,如果是大写字母则将其转换成相同的小写字母,如果不是大写字母则保留原来的字符,遍历结束之后返回新的字符串即可。

判断一个字符是否是大写字母的最直接的方法是通过 ASCII 码判断。由于 26 26 26 个大写字母的 ASCII 码连续,因此对于字符 c c c,只要判断 ‘A’ ≤ c ≤ ‘Z’ \text{`A'} \le c \le \text{`Z'} ‘A’≤c≤‘Z’ 是否成立,即可知道字符 c c c 是否是大写字母。

Java 的 Character \texttt{Character} Character 类有多个静态方法,其中的 isLetter \texttt{isLetter} isLetter 可以用于判断一个字符是否是字母。判断字符 c c c 是否是大写字母的另一个方法是判断「 c c c 是字母」和「 c ≤ ‘Z’ c \le \text{`Z'} c≤‘Z’」这两个条件是否都成立。

由于 Java 的 String \texttt{String} String 类型的对象是不可变的,因此需要转成其他类型之后才能进行转换操作。有两种做法可以将字符串对象变成可变类型。

第一种做法是调用 toCharArray \texttt{toCharArray} toCharArray 方法得到 char \texttt{char} char 类型的数组,然后遍历数组,对数组中的字符进行转换操作。

第二种做法是创建 StringBuffer \texttt{StringBuffer} StringBuffer 或 StringBuilder \texttt{StringBuilder} StringBuilder 类型的对象,即可变字符串对象,然后遍历 s s s,对于每个字符,如果是大写字母则将其转换成相同的小写字母,否则保留原来的字符,然后将字符拼接到可变字符串对象的末尾。

代码

下面的代码为调用 toCharArray \texttt{toCharArray} toCharArray 方法的做法。

class Solution {
    public String toLowerCase(String s) {
        char[] array = s.toCharArray();
        int length = array.length;
        for (int i = 0; i < length; i++) {
            char c = array[i];
            if (c >= 'A' && c <= 'Z') {
                array[i] += 'a' - 'A';
            }
        }
        return new String(array);
    }
}

下面的代码为创建 StringBuffer \texttt{StringBuffer} StringBuffer 类型的对象的做法。

class Solution {
    public String toLowerCase(String s) {
        StringBuffer sb = new StringBuffer();
        int length = s.length();
        for (int i = 0; i < length; i++) {
            char c = s.charAt(i);
            if (c >= 'A' && c <= 'Z') {
                c += 'a' - 'A';
            }
            sb.append(c);
        }
        return sb.toString();
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符串 s s s 的长度。需要遍历字符串 s s s 一次,对于每个字符,判断是否需要转换以及转换操作的时间复杂度是 O ( 1 ) O(1) O(1)。

  • 空间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符串 s s s 的长度。需要额外创建一个长度为 n n n 的数组或者一个长度为 n n n 的 StringBuffer \texttt{StringBuffer} StringBuffer 或 StringBuilder \texttt{StringBuilder} StringBuilder 类型的对象。由于 Java 中的 String \texttt{String} String 类型的对象不可变,因此空间复杂度至少为 O ( n ) O(n) O(n)。

上一篇:字符串题目:检测大写字母


下一篇:无重复字符的回文子串