【第08题】给定一个字符 c,要求转换成大写后输出 | ASCII码的应用
主要知识点
本节主要设计 ASCII 码的转换。
习题
1. Leetcode 709. 转换成小写字母
题目描述
给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。
初见
直接转换就可以了:
string toLowerCase(string s) {
for (int i = 0; i < s.size(); ++i) {
if ('A' <= s[i] && s[i] <= 'Z') {
s[i] = s[i] - ('A' - 'a');
}
}
return s;
}
思路
更进一步,可以用位运算实现大小写转换。a 的 ASCII 码值为
97
97
97 即
0110
0001
0110 \; 0001
01100001,A 的 ASCII 码值为
65
65
65 即
0100
0001
0100 \; 0001
01000001,易知:
- 大小写互相转换:
a=A^ 0010 0000 0010 \; 0000 00100000 ;A=a^ 0010 0000 0010 \; 0000 00100000; - 大小写均转换为小写:
a=a| 0010 0000 0010 \; 0000 00100000;a=A| 0010 0000 0010 \; 0000 00100000; - 大小写均转换为大写:
A=a& 1101 1111 1101 \; 1111 11011111;A=A& 1101 1111 1101 \; 1111 11011111;
代码
string toLowerCase(string str) {
for(auto &i : str){
i |= 32;
}
return str;
}
2. Leetcode 520. 检测大写字母
题目描述
我们定义,在以下情况时,单词的大写用法是正确的:
全部字母都是大写,比如 “USA” 。
单词中所有字母都不是大写,比如 “leetcode” 。
如果单词不只含有一个字母,只有首字母大写, 比如 “Google” 。
给你一个字符串 word 。如果大写用法正确,返回 true ;否则,返回 false 。
初见
根据题意,计算字符串中的大写字母数量与位置即可,由于只遍历一遍,因此时间复杂度为 O ( n ) O(n) O(n)
bool detectCapitalUse(string word) {
int bigNum(0);
bool firstBig(false);
for (int i = 0; i < word.size(); ++i) {
if ('A' <= word[i] && word[i] <= 'Z') {
if (i == 0) {
firstBig = true;
}
bigNum++;
}
}
if (bigNum == word.size() ||
(firstBig && bigNum == 1) ||
bigNum == 0) {
return true;
}
else {
return false;
}
}
总结
- 使用位运算完成大小写转换:
- 大小写互相转换:
a=A^ 32 ;A=a^ 32; - 大小写均转换为小写:
a=a| 32;a=A| 32; - 大小写均转换为大写:
A=a& -33;A=A& -33;
- 大小写互相转换:
本文介绍了如何利用ASCII码进行字符串中字符的大小写转换,包括直接转换和位运算两种方法,并给出了LeetCode两道相关题目——709.转换成小写字母和520.检测大写字母的解决方案。总结了位运算在大小写转换中的应用,例如a=A^32和A=a&-33。
3895

被折叠的 条评论
为什么被折叠?



