1768. Merge Strings Alternately
Analysis
交替合并字符串,多出来的字符放到末尾即可,这个题有点类似合并链表的题目。
Code
1 | class Solution { |
不过,这样写好像不是那么优雅,改一下:1
2
3
4
5
6
7
8
9
10
11
12class Solution {
public:
string mergeAlternately(string word1, string word2) {
string ret;
int i = 0, j = 0;
while(i < word1.length() || j < word2.length()) {
if(i < word1.length()) ret += word1[i++];
if(j < word2.length()) ret += word2[j++];
}
return ret;
}
};
1678. Goal Parser Interpretation
Analysis
简单的分词器,按照不同的情况判断就好。
Code
1 | class Solution { |
389. Find the Difference
Analysis
找出字符串 t 中多出的字母即可。
Code
method 1
直接散列。1
2
3
4
5
6
7
8
9
10
11
12
13class Solution {
public:
char findTheDifference(string s, string t) {
int letters[26] = {0}, i = 0;
while(i < s.length()) letters[s[i++] - 'a']++;
i = 0;
while(i < t.length()) {
int tmp = --letters[t[i++] - 'a'];
if(tmp < 0) break;
}
return t[--i];
}
};
method 2
当然也可以不使用散列,只需要将 2 个字符串字符的和求出做差,即可得到需要的结果。1
2
3
4
5
6
7
8
9class Solution {
public:
char findTheDifference(string s, string t) {
int sum1 = 0, sum2 = 0;
for(char ch: s) sum1 += ch;
for(char ch: t) sum2 += ch;
return sum2 - sum1;
}
};
之所以能这么干,是因为 ASCII 码本身就是以整数的形式存储的。
method 3
既然知道了 ASCII 码是整数形式存储的,那么这个问题就转化为了,寻找只出现一次的数,就可以利用位运算来完成了。1
2
3
4
5
6
7
8
9class Solution {
public:
char findTheDifference(string s, string t) {
char ret = 0;
for(char ch: s) ret ^= ch;
for(char ch: t) ret ^= ch;
return ret;
}
};
Summary
简单的字符串相关题目,做起来丝毫不废劲啊...不过还是要注意一下一题多解的情况,尽量开阔自己的思路,要能想到其他更优秀的解法。