「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅
第一阶段目标是:200道,每天1到2篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
今天题目:2029. 石子游戏 IX
难度:中等
Alice 和 Bob 再次设计了一款新的石子游戏。现有一行 n 个石子,每个石子都有一个关联的数字表示它的价值。给你一个整数数组 stones ,其中 stones[i] 是第 i 个石子的价值。
Alice 和 Bob 轮流进行自己的回合,Alice 先手。每一回合,玩家需要从 stones 中移除任一石子。
如果玩家移除石子后,导致 所有已移除石子 的价值 总和 可以被 3 整除,那么该玩家就 输掉游戏 。 如果不满足上一条,且移除后没有任何剩余的石子,那么 Bob 将会直接获胜(即便是在 Alice 的回合)。 假设两位玩家均采用 最佳 决策。如果 Alice 获胜,返回 true ;如果 Bob 获胜,返回 false 。
我的思路
- i为每次随机移除石子的下标;一个计数的数字,单数表示Alice,双数表示Bob;用一个新数组装移除的石子
- 每次换一个人,Alice先 count++
- 找出每次随机移除的第i个石子
- 将移除石头剪切出去,并移入到removed_stones中
- 接着判断所有移除石子的和能否被3整除,如果能这此人输掉游戏
- 如果不满足上一条,且移除后没有任何剩余的石子,则Bob 获胜,直接返回false
- 如果被3整除了,需要看是谁,通过count的值来确认
- 如果count能被2整除,说明是Bob输了,即Alice获胜,所返回值为true,如果count不能被2整除,则Bob获胜,返回false
代码实现
/**
* @param {number[]} stones
* @return {boolean}
*/
var stoneGameIX = function (stones) {
// i为每次随机移除石子的下标
var i;
//用一个新数组装移除的石子
var removed_stones = []
//一个计数的数字,单数表示Alice,双数表示Bob
var count = 0
for (; stones.length >= 1;) {
//每次换一个人,Alice先
count++
//找出每次随机移除的第i个石子
i = Math.floor(Math.random() * stones.length)
//将移除石头剪切出去,并移入到removed_stones中
temp = stones.splice(i, 1)
removed_stones.push(temp[0])
//接着判断所有移除石子的和能否被3整除,如果能这此人输掉游戏
var removed_stones_sum = 0
for (var k = 0; k < removed_stones.length; k++) {
removed_stones_sum += removed_stones[k]
}
if (removed_stones_sum % 3 === 0) {
break
}
// 如果不满足上一条,且移除后没有任何剩余的石子,则Bob 获胜,直接返回false
if (stones.length === 0) {
return false
}
}
// 如果被3整除了,需要看是谁,通过count的值来确认
// 如果count能被2整除,说明是Bob输了,即Alice获胜,所返回值为true
// 如果count不能被2整除,则Bob获胜,返回false
return count % 2 == 0 ? true : false
};
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹