普通视图

发现新文章,点击刷新页面。
今天 — 2024年11月30日技术

每日一题-判断是否可以赢得数字游戏🟢

2024年11月30日 00:00

给你一个 正整数 数组 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

调库tv之面对神人规则Bob当场释放忍术使用库函数的大手将Alice拍下桌

2024年11月19日 23:21

方法一:调库

由题意可知,$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)$,仅使用了常数个变量。

简洁写法(Python/Java/C++/C/Go/JS/Rust)

作者 endlesscheng
2024年7月28日 13:29

设 $s_1$ 为 $\textit{nums}$ 中的所有个位数之和,$s_2$ 为 $\textit{nums}$ 中的所有两位数之和。注意题目保证只有个位数和两位数。

小红若要获胜,必须满足 $s_1 > s_2$ 或者 $s_2 > s_1$,即

$$
s_1 \ne s_2
$$

代码实现时,可以令 $s = s_1 - s_2$,即累加 $\textit{nums}$ 的所有元素,把其中的两位数变成相反数累加。这样最后只需判断 $s\ne 0$ 即可。

具体请看 视频讲解,欢迎点赞关注~

###py

class Solution:
    def canAliceWin(self, nums: List[int]) -> bool:
        return sum(x if x < 10 else -x for x in nums) != 0

###java

class Solution {
    public boolean canAliceWin(int[] nums) {
        int s = 0;
        for (int x : nums) {
            s += x < 10 ? x : -x;
        }
        return s != 0;
    }
}

###cpp

class Solution {
public:
    bool canAliceWin(vector<int>& nums) {
        int s = 0;
        for (int x : nums) {
            s += x < 10 ? x : -x;
        }
        return s != 0;
    }
};

###c

bool canAliceWin(int* nums, int numsSize) {
    int s = 0;
    for (int i = 0; i < numsSize; i++) {
        s += nums[i] < 10 ? nums[i] : -nums[i];
    }
    return s != 0;
}

###go

func canAliceWin(nums []int) bool {
s := 0
for _, x := range nums {
if x < 10 {
s += x
} else {
s -= x
}
}
return s != 0
}

###js

var canAliceWin = function(nums) {
    let s = 0;
    for (const x of nums) {
        s += x < 10 ? x : -x;
    }
    return s !== 0;
};

###rust

impl Solution {
    pub fn can_alice_win(nums: Vec<i32>) -> bool {
        nums.iter().map(|&x| if x < 10 { x } else { -x }).sum::<i32>() != 0
    }
}

复杂度分析

  • 时间复杂度:$\mathcal{O}(n)$,其中 $n$ 是 $\textit{nums}$ 的长度。
  • 空间复杂度:$\mathcal{O}(1)$。

分类题单

如何科学刷题?

  1. 滑动窗口与双指针(定长/不定长/单序列/双序列/三指针)
  2. 二分算法(二分答案/最小化最大值/最大化最小值/第K小)
  3. 单调栈(基础/矩形面积/贡献法/最小字典序)
  4. 网格图(DFS/BFS/综合应用)
  5. 位运算(基础/性质/拆位/试填/恒等式/思维)
  6. 图论算法(DFS/BFS/拓扑排序/最短路/最小生成树/二分图/基环树/欧拉路径)
  7. 动态规划(入门/背包/状态机/划分/区间/状压/数位/数据结构优化/树形/博弈/概率期望)
  8. 常用数据结构(前缀和/差分/栈/队列/堆/字典树/并查集/树状数组/线段树)
  9. 数学算法(数论/组合/概率期望/博弈/计算几何/随机算法)
  10. 贪心与思维(基本贪心策略/反悔/区间/字典序/数学/思维/脑筋急转弯/构造)
  11. 链表、二叉树与一般树(前后指针/快慢指针/DFS/BFS/直径/LCA)
  12. 字符串(KMP/Z函数/Manacher/字符串哈希/AC自动机/后缀数组/子序列自动机)

我的题解精选(已分类)

欢迎关注 B站@灵茶山艾府

模拟

作者 tsreaper
2024年7月28日 12:33

解法:模拟

按题意模拟即可。复杂度 $\mathcal{O}(n)$。

参考代码(c++)

###cpp

class Solution {
public:
    bool canAliceWin(vector<int>& nums) {
        int sm = 0, a = 0, b = 0;
        for (int x : nums) {
            sm += x;
            if (x < 10) a += x;
            else b += x;
        }
        return a > sm - a || b > sm - b;
    }
};
昨天 — 2024年11月29日技术

leaferjs元素的基本使用

作者 雾恋
2024年11月29日 22:09
前篇文章我们介绍了leaferjs,那么这篇文章我们就来介绍一下leaferjs大致的元素和用法;这篇文章大致介绍一下以下几个元素的使用: - 矩形 - Rect - 圆形 - Ellipse -

XXL-JOB默认accessToken身份绕过RCE漏洞

2024年11月27日 11:40

​XXL-JOB 是一款开源的分布式任务调度平台,用于实现大规模任务的调度和执行。XXL-JOB 默认配置下,用于调度通讯的 accessToken 不是随机生成的,而是使用 application.properties 配置文件中的默认值。在实际使用中如果没有修改默认值,攻击者可利用此绕过认证调用 executor,执行任意代码,从而获取服务器权限。经分析和研判,该漏洞利用难度低,可导致远

内网代理篇 | 实验过程记录

2024年11月29日 09:19

内网多层代理实验记录

本次简单搭建了一个环境做多层代理测试,目的是解决内网渗透因为网段不同或者linux跳板无法访问web服务的情况。搭建了此环境,环境比较简陋,用kali的setoolkit钓鱼工具输搭建了个web。然后用ssh隧道将流量转给了节点3的windows,至于为何不用kali当节点。是因为想同时写ssh隧道的教程和venom的教程。

节点1:kali

代码审计辅助工具开发与实战

2024年11月27日 09:28

前言

在进行.Net源码审计时,往往会遇到拿到源码DLL文件,然后需要逐一使用反编译工具进行手动审计的情况。这种手动审计方法不仅费时费力,而且效率低下。虽然可以使用findstr /msi /c命令简单搜索字符串,但问题的根本在于无法确定关键字符串所在的方法位置,导致搜索字符串关键字如同大海捞针般

【🔥前端学rust】所有权

作者 菩提谛听
2024年11月29日 16:53
前言 这是  【🔥前端学rust】  系列文章的第六篇文章了。其他内容如下: 【🔥前端学rust】花式println和注释 【🔥前端学rust】基础数据类型 【🔥前端学rust】复合数据类型 【🔥前端

C++ explicit关键字的作用

作者 城西往事
2024年11月29日 16:44
‌**C++**中的explicit关键字主要用于防止构造函数进行隐式类型转换**‌。当构造函数被声明为explicit时,它只能通过显式构造对象的方式进行调用,而不能自动进行隐式类型转换。这有助于避

依赖包有问题怎么办

作者 小小良民
2024年11月29日 16:38
在前端开发中,如果你发现某个依赖包存在问题,可以考虑以下步骤来解决: 一、简单方案 1. 检查问题来源: 确认问题是否由依赖包引起,而不是你的代码或其他配置问题。 查看错误信息、文档和相关的 GitH
❌
❌