目录
12.12每日一题
1.题目描述
给你一个字符串 s
,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。
输入:s = "Hello"
输出:"hello"
看来是不是很简单??
2.直接API调用
class Solution
{
public String toLowerCase(String s)
{
return s.toLowerCase();
}
}
3.自己实现API
A-Z [65,90]
a-z [97,122]
大写字母的Unicode编码(向下兼容ASCII码)和小写字母的Unicode差32,所以我们直接+32即可
注意:Java中String不可变,所以需要创建一个StringBuilder来拼接
class Solution
{
public String toLowerCase(String s)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++)
{
char ch = s.charAt(i);
if (ch >= 'A' && ch <= 'Z')
{
ch += 32;
}
sb.append(ch);
}
return sb.toString();
}
}
3.位运算优化
没想到吧,这题也能用位运算!!
A-Z [65,90]
a-z [97,122]
65
对于的二进制为 0100 0001
66
对应的二进制为 0100 0010
.....
90
对应的二进制为 0101 1010
它们的差值 32
对应的二进制位是 0010 0000
我们不难发现,65-90 的二进制位中表示 32 的那位二进制都是 0(即从右往左数第六位),而 97-122 表示 32 的那位二进制都是 1, 所以我们只需要把 从右往左数第六位 由0变为1即可,所以可以对大写字母与32进行按位或,来代替加法。
例如 :
A == 0100 0001
| 0010 0000
= 0110 0001 == ‘a'
class Solution
{
public String toLowerCase(String s)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++)
{
char ch = s.charAt(i);
if (ch >= 'A' && ch <= 'Z')
{
ch |= 32;
}
sb.append(ch);
}
return sb.toString();
}
}
4.拓展
小写转大写
按照上面的规律,只需要把表示 32 的那位二进制位变为 0 即可(即从右往左数第六位),所以我们可以让小写字母与 1101 1111
(十进制对应 223 )进行按位与运算
例如:
a == 0110 0001
& 1101 1111
= 0100 0001 == 'A'
class Solution
{
public String toLowerCase(String s)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++)
{
char ch = s.charAt(i);
if (ch >= 'a' && ch <= 'z')
{
ch &= 223;
}
sb.append(ch);
}
return sb.toString();
}
}
相互转化
把1变为,把0变1,即与32进行按位异或
class Solution
{
public String toLowerCase(String s)
{
StringBuilder sb = new StringBuilder();
for (int i = 0; i < s.length(); i++)
{
char ch = s.charAt(i);
ch ^= 32;
sb.append(ch);
}
return sb.toString();
}
}