方法一:调库
由题意可知,$Alice$ 在一位数之和以及两位数之和中拥有选择较大者的权利,因此,只要一位数之和与两位数之和不相等,那么 $Alice$ 即可获胜。
具体来说,我们可以选择遍历数组,当此时的数字为一位数,即 $num<10$ 时,我们将 $num$ 直接加入结果中;否则,我们将 $-num$ 加入结果中。最终我们返回结果是否为 $0$ 即可。
参考代码
###C#
public class Solution {
public bool CanAliceWin(int[] nums) {
return nums.Sum(i => i < 10 ? i : -i) != 0;
}
}
###C++
class Solution {
public:
static bool canAliceWin(const std::vector<int>& nums) {
return std::accumulate(nums.begin(), nums.end(), 0, [](int last, int i) {
return last + (i < 10 ? i : -i);
}) != 0;
}
};
###Java
class Solution {
public boolean canAliceWin(int[] nums) {
return Arrays.stream(nums).map(i -> i < 10 ? i : -i).sum() != 0;
}
}
###Python
class Solution:
def canAliceWin(self, nums: List[int]) -> bool:
return sum(i if i < 10 else -i for i in nums) != 0
###Kotlin
class Solution {
fun canAliceWin(nums: IntArray): Boolean {
return nums.sumOf { if (it < 10) it else -it } != 0
}
}
- 时间复杂度: $O(n)$,其中 $n$ 为 $nums$ 的长度。
- 空间复杂度: $O(1)$,仅使用了常数个变量。