Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅
第一阶段目标是:200道,每天1到2篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
今天题目:2038. 如果相邻两个颜色均相同则删除当前颜色
总共有 n 个颜色片段排成一列,每个颜色片段要么是 'A' 要么是 'B' 。给你一个长度为 n 的字符串 colors ,其中 colors[i] 表示第 i 个颜色片段的颜色。
Alice 和 Bob 在玩一个游戏,他们 轮流 从这个字符串中删除颜色。Alice 先手 。
如果一个颜色片段为 'A' 且 相邻两个颜色 都是颜色 'A' ,那么 Alice 可以删除该颜色片段。Alice 不可以 删除任何颜色 'B' 片段。 如果一个颜色片段为 'B' 且 相邻两个颜色 都是颜色 'B' ,那么 Bob 可以删除该颜色片段。Bob 不可以 删除任何颜色 'A' 片段。 Alice 和 Bob 不能 从字符串两端删除颜色片段。 如果其中一人无法继续操作,则该玩家 输 掉游戏且另一玩家 获胜 。 假设 Alice 和 Bob 都采用最优策略,如果 Alice 获胜,请返回 true,否则 Bob 获胜,返回 false。
示例 1:
输入:colors = "AAABABB" 输出:true 解释: AAABABB -> AABABB Alice 先操作。 她删除从左数第二个 'A' ,这也是唯一一个相邻颜色片段都是 'A' 的 'A' 。
现在轮到 Bob 操作。 Bob 无法执行任何操作,因为没有相邻位置都是 'B' 的颜色片段 'B' 。 因此,Alice 获胜,返回 true 。 示例 2:
输入:colors = "AA" 输出:false 解释: Alice 先操作。 只有 2 个 'A' 且它们都在字符串的两端,所以她无法执行任何操作。 因此,Bob 获胜,返回 false 。 示例 3:
输入:colors = "ABBBBBBBAAA" 输出:false 解释: ABBBBBBBAAA -> ABBBBBBBAA Alice 先操作。 她唯一的选择是删除从右数起第二个 'A' 。
ABBBBBBBAA -> ABBBBBBAA 接下来轮到 Bob 操作。 他有许多选择,他可以选择任何一个 'B' 删除。
然后轮到 Alice 操作,她无法删除任何片段。 所以 Bob 获胜,返回 false 。
我的思路
说白了就是两个人谁能消掉的字母多谁赢,此时我们可能需要考虑两个问题:
问题一:A消除会不会影响到B的消除? 答:完全不会!因为A消除的条件是A被两个A夹住,那么即使A消除了,也不会出现B旁边原本是A结果消除之后变成了B的情况,所以不需要考虑这个问题,干就完了!
问题二:需不需要在每次找到一个符合条件的情况时,去删除掉该元素呢? 答:完全不需要,删不删都一个样!可以多多尝试,哈哈哈这里我就不赘述了
所以说白了,就是数数,数谁能消除的字母多一点,谁就赢了! 然后就是一个循环,计数就可以啦,
代码实现
var winnerOfGame = function (colors) {
let num = 0
for (let i = 1; i < colors.length-1; i++) {
if (colors[i] == 'A' && colors[i - 1] == 'A' && colors[i + 1] == 'A') {
num++
}
if (colors[i] == 'B' && colors[i - 1] == 'B' && colors[i + 1] == 'B') {
num--
}
}
return num <= 0 ? false : true
};
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹