专栏名称: 吴师兄学算法
和程序员小吴一起从初学者的角度学习算法,以动画的形式呈现解题的思路。每周四篇原创文章,期待你的鉴赏!
目录
相关文章推荐
镇江发布  ·  教育部重要通知! ·  20 小时前  
福州日报  ·  教育部:这些名称不再使用→ ·  2 天前  
长江日报  ·  武汉一部属高校,党委书记调整 ·  2 天前  
长江日报  ·  武汉一部属高校,党委书记调整 ·  2 天前  
桦爸聊升学  ·  全国高考时间,定了! ·  3 天前  
51好读  ›  专栏  ›  吴师兄学算法

面试字节,总包100w,高得离谱。。。

吴师兄学算法  · 公众号  ·  · 2024-04-15 20:30

正文

大家好,我是吴师兄。

最近和一些国外的学员进行了沟通,其中有不少的同学在涉及未来就业选择的时候,会拿出字节跳动的海外技术岗位作为一个备选方案。

毕竟,字节的业务全球化是众所周知的,因此也成为某些国家眼中的香饽饽。

同时,字节平台够大,技术实力扎实,非常适合有技术追求的程序员。

当然,最重要的是给钱也大方,比如下图中的这个同学,五年经验就拿到了总包 100w 的 offer,放在哪个互联网大厂在同级当中都属于高薪。


继续今天的算法学习,来一个简单的算法题: 除数博弈

一、题目描述

爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。

最初,黑板上有一个数字 n 。在每个玩家的回合,玩家需要执行以下操作:

  • 选出任一 x ,满足 0 < x < n n % x == 0
  • n - x 替换黑板上的数字 n

如果玩家无法执行这些操作,就会输掉游戏。

只有在爱丽丝在游戏中取得胜利时才返回 true 。假设两个玩家都以最佳状态参与游戏。

示例 1:

输入:n = 2
输出:true
解释:爱丽丝选择 1,鲍勃无法进行操作。

示例 2:

输入:n = 3
输出:false
解释:爱丽丝选择 1,鲍勃也选择 1,然后爱丽丝无法进行操作。

提示:

  • 1 <= n <= 1000

二、题目解析

算法思路:

  1. 当 n 为偶数时,Alice 可以选择 x = 1,使得 n 变为 n - 1,即奇数。Bob 只能选择奇数,最终轮到 Alice 时,n 为偶数,依次类推,直到 n 变为 2,Alice 取 1,Bob 无法操作,Alice 获胜。
  2. 当 n 为奇数时,Alice 只能选择奇数 x,使得 n 变为偶数。Bob 可以选择 x = 1,使得 n 变为奇数,依次类推,直到 n 变为 2,Alice 无法操作,Bob 获胜。

根据上述分析可知,当 n 为偶数时,Alice 必胜;当 n 为奇数时,Bob 必胜。因此,判断 n 是否为偶数即可得到游戏结果。

代码解析:

  • 判断 n 是否为偶数,若是则返回 true,表示 Alice 能够赢得游戏;若不是则返回 false,表示 Bob 能够赢得游戏。

算法正确性证明:

  • 当 n 为偶数时,Alice 可以选择 x = 1,使得 n 变为奇数,而奇数只能被奇数整除,因此 Bob 只能选择奇数,最终轮到 Alice 时,n 变为 2,Alice 取 1,Bob 无法操作,Alice 获胜。
  • 当 n 为奇数时,Alice 只能选择奇数 x,使得 n 变为偶数,而偶数可以被奇数和偶数整除,Bob 可以选择 x = 1,使得 n 变为奇数,依次类推,直到 n 变为 2,Alice 无法操作,Bob 获胜。

算法的优势:

  • 算法简单直观,通过判断 n 是否为偶数即可得到游戏结果。
  • 时间复杂度为 O(1),效率较高。

算法的适用性:

  • 适用于解决该类游戏问题,即两位玩家轮流执行操作,最终判断谁能赢得游戏。

总结:本算法通过简单的数学分析得出结论,判断 n 是否为偶数即可确定游戏的结果。在解决这类游戏问题时,可以考虑使用该算法,简洁高效。

三、参考代码

1、Java 代码

// 登录 AlgoMooc 官网获取更多算法图解
// https://www.algomooc.com
// 作者:程序员吴师兄
// 添加微信 278166530 获取最新课程
// 代码有看不懂的地方一定要私聊咨询吴师兄呀
// 除数博弈(LeetCode 1025):https://leetcode.cn/problems/divisor-game/
class Solution {
    public boolean divisorGame(int n) {

        return n % 2 == 0;
        
    }
}

2、C++代码







请到「今天看啥」查看全文