Leetcode_12 天编程能力入门_day9

还是 3 个字符串相关的题目。

709. To Lower Case

Analysis

只用将大写字母转换为小写即可。

Code

1
2
3
4
5
6
7
8
9
class Solution {
public:
string toLowerCase(string s) {
for(int i = 0; i < s.length(); i++) {
if(isupper(s[i])) s[i] = tolower(s[i]);
}
return s;
}
};

em,既然使用 C++ 写的,就用 C++11 的写法:

1
2
3
4
5
6
7
8
9
class Solution {
public:
string toLowerCase(string s) {
for(char& ch: s) {
ch = tolower(ch);
}
return s;
}
};

也可以自己实现 tolower 的功能:

1
2
3
4
5
6
7
8
9
class Solution {
public:
string toLowerCase(string s) {
for(char& ch: s) {
if(isupper(ch)) ch |= 32;
}
return s;
}
};

为什么可以写成ch |= 32?因为大写字母的 ASCII 码要转换为小写就是加上 32,而这些大写字母的二进制表示有一个共同点,那就是表示 32 的那一位上全部是 0。换句话说,要让这个数字增加 32,只需要将这个数字的表示 32 的二进制数位从 0 变成 1 即可。这样写的好处就是用位运算取代了加运算,可以极大的提升效率。

1309. Decrypt String from Alphabet to Integer Mapping

Analysis

解码字符串,em,这是个简单的字符串分类讨论题。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public:
string freqAlphabets(string s) {
string ret;
int i = 0;
while(i < s.length()) {
if(isdigit(s[i])) {
if(isdigit(s[i + 1]) && s[i + 2] == '#') {
ret += ((s[i] - '0') * 10 + (s[i + 1] - '0') + 'a' - 1);
i += 3;
} else {
ret += (s[i] - '0' + 'a' - 1);
i += 1;
}
}
}
return ret;
}
};

em,逻辑过程还可以更加精炼一点:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Solution {
public:
string freqAlphabets(string s) {
string ret;
int i = 0;
while(i < s.length()) {
if(i + 2 < s.length() && s[i + 2] == '#') {
ret += ((s[i] - '0') * 10 + (s[i + 1] - '0') - 1 + 'a');
i += 3;
} else {
ret += (s[i] - '0' - 1 + 'a');
i += 1;
}
}
return ret;
}
};

953. Verifying an Alien Dictionary

Analysis

按照给定的顺序对字符串排序,em,这个题好像是字符串排序的原理。

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Solution {
public:
bool isAlienSorted(vector<string>& words, string order) {
int seq[26] = {0};
for(int i = 0; i < order.length(); i++) {
seq[order[i] - 'a'] = i;
}
for(int i = 0; i < words.size() - 1; i++) {
int minlen = min(words[i].length(), words[i + 1].length()), index = 0;
bool flag = true;
while(index < minlen) {
if(words[i][index] != words[i + 1][index]) {
if(seq[words[i][index] - 'a'] > seq[words[i + 1][index] - 'a']) {
flag = false;
}
break;
}
index++;
}
if(!flag) return false;
else if(index == minlen && words[i].length() > words[i + 1].length()) return false;
}
return true;
}
};

这个题有点麻烦,但不是个难题。因为不同的样例会给出不同的字母顺序,所以最好将字母顺序散列的保存起来,后面比较的时候就可以直接用了。

Summary

em,3 个简单的字符串相关题目,都挺简单的。


Buy me a coffee ? :)
0%