Java&C++题解与拓展——leetcode2038.如果相邻两个颜色均相同则删除当前颜色【没啥新知识】

145 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

每日一题做题记录,参考官方和三叶的题解

题目要求

在这里插入图片描述

思路

分析题目可以发现,给出字符串后,可以删除的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),因为==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(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(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(1)O(1)

总结

本题还是很简单的,划分到中等感觉不至于,只要想清楚可删除数量不会随着操作改变,实现方法其实有很多种,其核心都是遍历一次整个字符串,所以各种方法时空复杂度区别也都不大。

小小吐槽

最后分享一个热评段子,吐槽一下这个游戏。 在这里插入图片描述


欢迎指正与讨论!