文章目录
题目
标题和出处
标题:转换成小写字母
出处: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)。