力扣-3232. 判断是否可以赢得数字游戏
给你一个 正整数 数组 nums
。
Alice 和 Bob 正在玩游戏。在游戏中,Alice 可以从 nums
中选择所有个位数 或 所有两位数,剩余的数字归 Bob 所有。如果 Alice 所选数字之和 严格大于 Bob 的数字之和,则 Alice 获胜。
如果 Alice 能赢得这场游戏,返回 true
;否则,返回 false
。
示例 1:
输入:nums = [1,2,3,4,10]
输出:false
解释:
Alice 不管选个位数还是两位数都无法赢得比赛。
示例 2:
输入:nums = [1,2,3,4,5,14]
输出:true
解释:
Alice 选择个位数可以赢得比赛,所选数字之和为 15。
示例 3:
输入:nums = [5,5,5,25]
输出:true
解释:
Alice 选择两位数可以赢得比赛,所选数字之和为 25。
提示:
1 <= nums.length <= 100
1 <= nums[i] <= 99
class Solution:def canAliceWin(self, nums: List[int]) -> bool:return sum(x if x < 10 else -x for x in nums) != 0
解释
定义函数和类:
class Solution
: 定义一个类Solution
。def canAliceWin(self, nums: List[int]) -> bool
: 定义类中的方法canAliceWin
,接收一个整数数组nums
,返回一个布尔值。计算总和:
sum(x if x < 10 else -x for x in nums)
: 这是一个生成器表达式,它遍历nums
中的每个元素x
,并根据条件对每个元素进行处理。
x if x < 10 else -x
: 如果x
是个位数(即x < 10
),则直接取它的值x
。否则,取它的负值-x
(即两位数取负值)。sum(...)
: 将上述条件处理后的所有值求和。比较结果:
sum(x if x < 10 else -x for x in nums) != 0
: 比较计算出的总和是否不等于0。
- 如果不等于0,返回
True
,表示Alice可以赢得比赛。- 如果等于0,返回
False
,表示Alice不能赢得比赛。思路解释
这段代码的核心思想是计算Alice选择的所有个位数的总和与Bob选择的所有两位数的总和之间的差异:
- 如果Alice选择所有个位数,她的得分就是所有个位数的和。
- 如果Alice选择所有两位数,她的得分就是所有两位数的和。
通过将个位数保留原值(
x if x < 10
)并将两位数取负值(-x
),我们可以通过求和来快速判断两者的总和是否相等:
- 如果
sum(x if x < 10 else -x for x in nums)
的结果不为0,说明Alice选择的某一类数字(个位数或两位数)的和与Bob的总和不同,Alice可以赢得比赛。- 如果结果为0,说明无论Alice选择哪一类数字,两者的总和都是一样的,Alice无法赢得比赛。
这段代码有效地利用了Python的生成器表达式和条件表达式来简化判断逻辑