问题描述:
实现函数 ToLowerCase(),该函数接收一个字符串参数 str,并将该字符串中的大写字母转换成小写字母,之后返回新的字符串。
示例 1:
输入: “Hello”
输出: “hello”
示例 2:
输入: “here”
输出: “here”
示例 3:
输入: “LOVELY”
输出: “lovely”
想法
- 遍历字符串charAt(i),取每一位
判断每位上是否是小写字符,是则转换,不是则循环写一位
判断小写字母的方法一:
Character.isUpperCase(c)是否是大写字母,转成小写Character.toLowerCase(c);
Character.isLowerCase(c)是否是大写字母,转成大写Character.toUpperCase(c);判断小写字母的方法二:
通过ASCII码判断字母大小写 ASCII在65-90之间是大写,97-122是小写,大转小加32 小转大减去32
实现 一
class Solution {
public String toLowerCase(String str) {
if(str==null||str.length()==0){
return null;
}
char[] chars =str.toCharArray();
int len = chars.length;
for (int i = 0;i<len;i++){
char c = chars[i];
if(Character.isUpperCase(str.charAt(i))){
chars[i]= Character.toLowerCase(chars[i]);//这里要注意赋给的是当前循环变量chars[i],而不是局部变量c
}
}
String resule = new String(chars);
return resule;
}
}
注:
当对字符串转成char数组之后,对于每个符合要求的char进行重新赋值,赋的也是char数组当中的,要重新写入字符串中才能表现出来。
问: str.charAt(i)= Character.toLowerCase(str.charAt(i));???Variable expected
答:
public char charAt(int index) {
if ((index < 0) || (index >= value.length)) {
throw new StringIndexOutOfBoundsException(index);
}
return value[index];
}
private final char value[];
这里的数组是fianl修饰的不可修的,想要修改new StringBuilder()???
StringBuilder stringBuilder = new StringBuilder(str);
char a = stringBuilder.charAt(3);
char b = Character.toLowerCase(a);
stringBuilder.setCharAt(3,b);
实现二
class Solution {
public String toLowerCase(String str) {
if (str == null || str.length() == 0) {
return null;
}
byte[] bytes = str.getBytes();
for (int i = 0, length = bytes.length; i < length; i++) {
//如果ASCII在65-90之间为大写,加上32变为小写
if (bytes[i] >= 65 && bytes[i] <= 90) {
bytes[i] += 32;
// bytes[i] = bytes[i]+32;这是错误的,为什么不行呢?
Java中的byte,short,char进行计算时都会提升为int类型,
分开表示两部 运算 赋值,运算提升,赋值的时候降回byte,需要转换类型 bytes[i] = (byte)(bytes[i]+ 32);
+=就是在本单位内运算,+=相当于告诉程序 这个位置的数据+32
}
}
String s = new String(bytes);
return s;
}
}