每日一题做题记录,参考官方和三叶的题解 |
题目要求
思路
分析题目可以发现,给出字符串后,可以删除的A和B的数量是确定的,不会随着操作改变,所以只要统计符合条件的A/B数量进行比较即可。
实现一
Java
class Solution {
public boolean winnerOfGame(String colors) {
char[] c = colors.toCharArray();
int len = c.length;
int a = 0, b = 0; //Alice和Bob可操作的步骤数量
for(int i = 1; i< len - 1; i++) {
if(c[i] == 'A' && c[i - 1] == 'A' && c[i + 1] == 'A')
a++;
if(c[i] == 'B' && c[i - 1] == 'B' && c[i + 1] == 'B')
b++;
}
return a > b;
}
}
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( n ) O(n) O(n),因为toCharArray操作会产生新数组,若直接使用colors.charAt(i)可减少到O(1)。
C++
class Solution {
public:
bool winnerOfGame(string colors) {
int len = colors.length();
int a = 0, b = 0;
for(int i = 1; i < len; i++) {
if(colors[i] == 'A' && colors[i - 1] == 'A' && colors[i + 1] == 'A')
a++;
if(colors[i] == 'B' && colors[i - 1] == 'B' && colors[i + 1] == 'B')
b++;
}
return a > b;
}
};
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)
实现二
Java
class Solution {
public boolean winnerOfGame(String colors) {
int[] freq = {0, 0};
char cur = 'V';
int cnt = 0;
for(int i = 0; i < colors.length(); i++) {
char c = colors.charAt(i);
if(c != cur) {
cur = c;
cnt = 1;
}
else if(++cnt >= 3)
++freq[cur - 'A'];
}
return freq[0] > freq[1];
}
}
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)
C++
class Solution {
public:
bool winnerOfGame(string colors) {
int freq[2] = {0, 0};
char cur = 'V';
int cnt = 0;
for(char c : colors) {
if(c != cur) {
cur = c;
cnt = 1;
}
else if(++cnt >= 3)
++freq[cur - 'A'];
}
return freq[0] > freq[1];
}
};
- 时间复杂度: O ( n ) O(n) O(n)
- 空间复杂度: O ( 1 ) O(1) O(1)
总结
本题还是很简单的,划分到中等感觉不至于,只要想清楚可删除数量不会随着操作改变,实现方法其实有很多种,其核心都是遍历一次整个字符串,所以各种方法时空复杂度区别也都不大。
小小吐槽
最后分享一个热评段子,吐槽一下这个游戏。
欢迎指正与讨论! |