LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法

news2025/7/13 9:55:04

LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法

井字游戏+优势洗牌+Dota2参议院

  • 1 井字游戏
    • 题目描述
    • 解题思路与代码
  • 2 优势洗牌
    • 题目描述
    • 解题思路与代码
  • 3 Dota2参议院
    • 题目描述
    • 解题思路与代码

1 井字游戏

题目描述

用字符串数组作为井字游戏的游戏板 board,判断该游戏板有没有可能最终形成游戏板是一个 3 x 3 数组,由字符 " ",“X” 和 “O” 组成。字符 " " 代表一个空位。

两个玩家轮流将字符放入空位,一个玩家执X棋,另一个玩家执O棋“X” 和 “O” 只允许放置在空位中,不允许对已放有字符的位置进行填充。

当有 3 个相同(且非空)的字符填充任何行、列或对角线时,游戏结束,board生成

解题思路与代码

分类讨论

    public static boolean validBoard(String[] board) {
        int xCount = 0, oCount = 0;
        for (String row: board)
            for (char c: row.toCharArray()) {
                if (c == 'X') xCount++;
                if (c == 'O') oCount++;
            }
        //X与O 一样多,或者X比O多一个(X赢则X多一个,O赢则一样多)
        if (oCount != xCount && oCount != xCount - 1) return false;
        if (win(board, "XXX") && oCount != xCount - 1) return false;
        if (win(board, "OOO") && oCount != xCount) return false;
        return true;
    }
    public static boolean win(String[] board, String flag) {
        for (int i = 0; i < 3; ++i) {
                    //纵向3连
            if (flag.equals("" + board[i].charAt(0) + board[i].charAt(1) +
                    board[i].charAt(2)))
                return true;
            //横向3连
            if (flag.equals(board[i]))
                return true;
        }
        // \向3连
        if (flag.equals(""+
                board[0].charAt(0)+board[1].charAt(1)+board[2].charAt(2)))
            return true;
        // /向3连
        if
        (flag.equals(""+board[0].charAt(2)+board[1].charAt(1)+board[2].charAt(0)))
            return true;
        return false;
    }

2 优势洗牌

题目描述

给定两个大小相等的数组 A 和 B,A 相对于 B 的优势可以用满足 A[i] > B[i] 的索引 i 的数目来描述。

返回 A 的任意排列,使其相对于 B 的优势最大化。

LeetCode优势洗牌

解题思路与代码

    public static int[] advantageCount(int[] A, int[] B) {
        int[] sortedA = A.clone();
        Arrays.sort(sortedA);//找一个代价最小的去匹配B中的,比B大,在A中又是最小的
        int[] sortedB = B.clone();
        Arrays.sort(sortedB);//避免比较时,A每次都要重头遍历
        Map<Integer, Deque<Integer>> assigned = new HashMap();
        for (int b: B)
            assigned.put(b, new LinkedList());
        Deque<Integer> remaining = new LinkedList();
        int j = 0;
        for (int a: sortedA) {
            if (a > sortedB[j]) {
                assigned.get(sortedB[j++]).add(a);
            } else {
                remaining.add(a);
            }
        }
        int[] ans = new int[B.length];
        for (int i = 0; i < B.length; ++i) {
            if (assigned.get(B[i]).size() > 0)
                ans[i] = assigned.get(B[i]).removeLast();
            else
                ans[i] = remaining.removeLast();
        }
        return ans;
    }
  • 时间复杂度:O(N log N),其中 N 是 A 和 B 的长度。
  • 空间复杂度:O(N)。

3 Dota2参议院

题目描述

Dota2 的世界里有两个阵营:Radiant(天辉)和 Dire(夜魇)

Dota2 参议院由来自两派的参议员组成。现在参议院希望对一个 Dota2 游戏里的改变作出决定。他们以一个基于轮为过程的投票进行。在每一轮中,每一位参议员都可以行使两项权利中的一项:

  1. 禁止一名参议员的权利:参议员可以让另一位参议员在这一轮和随后的几轮中丧失所有的权利。
  2. 宣布胜利: 如果参议员发现有权利投票的参议员都是同一个阵营的,他可以宣布胜利并决定在游戏中的有关变化。

给定一个字符串代表每个参议员的阵营。字母 “R” 和 “D” 分别代表了 Radiant(天辉)和 Dire(夜魇)。然后,如果有 n 个参议员,给定字符串的大小将是 n。

以轮为基础的过程从给定顺序的第一个参议员开始到最后一个参议员结束。这一过程将持续到投票结束。所有失去权利的参议员将在过程中被跳过。

假设每一位参议员都足够聪明,会为自己的政党做出最好的策略,你需要预测哪一方最终会宣布胜利并在 Dota2 游戏中决定改变。输出应该是 Radiant 或 Dire。

解题思路与代码

    public String predictPartyVictory(String senate) {
        int n = senate.length();
        Queue<Integer> radiant = new LinkedList<Integer>();
        Queue<Integer> dire = new LinkedList<Integer>();
        for (int i = 0; i < n; ++i) {
            if (senate.charAt(i) == 'R') {
                radiant.offer(i);
            } else {
                dire.offer(i);
            }
        }
        while (!radiant.isEmpty() && !dire.isEmpty()) {
            int radiantIndex = radiant.poll(), direIndex = dire.poll();
            if (radiantIndex < direIndex) {
                radiant.offer(radiantIndex + n);
            } else {
                dire.offer(direIndex + n);
            }
        }
        return !radiant.isEmpty() ? "Radiant" : "Dire";
    }

  • 时间和空间:O(n)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/369360.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux 服务器CPU超高如何快速定位

前言 在生产环境中有时会遇见服务器CPU超高的问题&#xff0c;特别是重大版本发布后如果有内存泄露很容出现CPU超高&#xff0c;严重可能会达到100%。现在我们使用的服务器都是多核CPU&#xff0c;当出现CPU告警我们需要及时发现问题代码并处置&#xff0c;不然严重情况下会导致…

【阿旭机器学习实战】【36】糖尿病预测---决策树建模及其可视化

【阿旭机器学习实战】系列文章主要介绍机器学习的各种算法模型及其实战案例&#xff0c;欢迎点赞&#xff0c;关注共同学习交流。 【阿旭机器学习实战】【36】糖尿病预测—决策树建模及其可视化 目录【阿旭机器学习实战】【36】糖尿病预测---决策树建模及其可视化1. 导入数据并…

Datacom-HCIE考试经验分享

我是誉天Datacom秦同学。作为誉天众多通过Datacom-HCIE考试的学员之一&#xff0c;我感到很荣幸。 首先说说自学的感受吧&#xff1a; 我是从2020年开始接触网络行业的&#xff0c;听单位的前辈说华为的HCIE认证是行业含金量最高的证书&#xff0c;从那时起心里就种下了一个“I…

用 Visual Studio 升级 .NET 项目

现在&#xff0c;你已可以使用 Visual Studio 将所有 .NET 应用程序升级到最新版本的 .NET&#xff01;这一功能可以从 Visual Studio 扩展包中获取&#xff0c;它会升级你的 .NET Framework 或 .NET Core 网页和桌面应用程序。一些项目类型仍正在开发中并将在不久的未来推出&a…

spring Bean的生命周期 IOC

文章目录 1. 基础知识1.1 什么是 IoC ?2. 扩展方法3. 源码入口1. 基础知识 1.1 什么是 IoC ? IoC,控制反转,想必大家都知道,所谓的控制反转,就是把 new 对象的权利交给容器,所有的对象都被容器控制,这就叫所谓的控制反转。 IoC 很好地体现了面向对象设计法则之一 —…

适合运动时戴的蓝牙耳机有哪些、2023热门运动耳机推荐

在运动时听音乐&#xff0c;歌曲里的节奏、歌词都可以改变人的心态以及分散注意力&#xff0c;还能有效提升运动后的效果。在运动中听音乐&#xff0c;已经变为了一种随处可见的习惯。那么一款好的运动耳机&#xff0c;可以让运动更有激情&#xff0c;也能更好地享受运动的乐趣…

Pikachu靶场(暴力破解)

目录标题暴力破解&#xff08;登录&#xff09;基于表单的暴力破解验证码绕过(on server)验证码绕过(on client)token防爆破?上学期用这个靶场写过作业&#xff0c;现在抽空给它过一遍&#xff0c;由于需要抓包&#xff0c;从而通过小皮&#xff0c;使用本地&#xff08;127.0…

RestTemplate 报错 I/O error on POST request for

问题&#xff1a; org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://www.xxx.com/xxx/xxx/xxx": Read timed out; nested exception is java.net.SocketTimeoutException: Read timed out 场景&#xff1a; 在代码…

【mysql和clickhouse 查看当前链接进程信息】

前言 我们有时候服务器会突然内存溢出&#xff0c;这时候我们会去服务器上查看&#xff0c;是否是Mysql查询的时候用的时间太长&#xff0c;我们去查看当前进程情况。 正文 ClickHouse自带用于记录系统信息的系统库system&#xff0c;通过processes表&#xff0c;我们可以查…

H5项目中使用微信JS-SDK(以H5项目批量上传图片为例,兼容IOS及安卓)

H5项目中使用微信图片上传相关sdk&#xff0c;主要用于解决 1.安卓手机无法一次选择多张图片进行上传问题&#xff1b;2.控制IOS系统手机一次可无限量选择图片上传的问题 一、准备工作&#xff1a;公众号配置 验证所需使用的sdk是否符合需求 可在使用场景中&#xff0c;打开微…

MOS管选型参数:VGS(th)

MOS管选型参数&#xff1a;VGS(th) VGS&#xff08;th&#xff09;&#xff1a;开启电压&#xff08;阀值电压&#xff09;。当外加栅极控制电压 VGS 超过 VGS&#xff08;th&#xff09; 时&#xff0c;漏区和源区的表面反型层形成了连接的沟道。应用中&#xff0c;常将漏极短…

如何拥有自己的Gitee代码仓库

本教程适用码云代码托管平台 https://gitee.com/ 首先在电脑上安装Git&#xff08;哔站有安装Git教程&#xff09;和注册gitee账号后再来阅读此教程 1、在设置页面中点击 SSH公钥 2、点击 怎样生成公钥 3、点击公钥管理 4、点击 生成\添加SSH公钥 5、打开终端 输入如图红框中的…

MyBatis学习笔记(二) —— 搭建MyBatis项目

2、搭建MyBatis 2.1、开发环境 IDE&#xff1a;idea 2019.2 构建工具&#xff1a;maven 3.5.4 MySQL版本&#xff1a;MySQL 8 MyBatis版本&#xff1a;MyBatis 3.5.7 MySQL不同版本的注意事项 1、驱动类 driver-class-name MySQL 5版本使用jdbc5驱动&#xff0c;驱动类使用…

【人工智能 AI】Robotic Process Automation (RPA) 机器人流程自动化 (RPA)

目录 ROBOTIC PROCESS AUTOMATION SERVICES机器人流程自动化服务 What is RPA? 什么是机器人流程自动化?

【storybook】你需要一款能在独立环境下开发组件并生成可视化控件文档的框架吗?(三)

storybook插件addons核心插件插件APIargTypes写文档组件注释法MDX生成在线可视化UI文档上一篇&#xff1a; https://blog.csdn.net/tuzi007a/article/details/129194267插件addons 插件用于增强storybook的UI功能。 核心插件 storybook/addon-essentials 它几乎控制了整个s…

Java实现阴历日历表(附带星座)

准备工作 1.无敌外挂(GitHub直达源码) Nobb 直击灵魂 https://github.com/xuyishanBD/Java_create_calendar.git2.maven配置(如果没有走上面的捷径) <dependencies><dependency><groupId>net.sourceforge.javacsv</groupId><artifactId>javac…

Pytorch从零开始训练模型【识别数字模型】并测试

1 准备数据集 import torch import torchvision # 去网上下载CIFAR10数据集【此数据集为经典的图像数字识别数据集】 # train True 代表取其中得训练数据集&#xff1b; # transform 参数代表将图像转换为Tensor形式 # download 为True时会去网上下载数据集到指定路径【root】…

用Python获取弹幕的两种方式(一种简单但量少,另一量大管饱)

前言 弹幕可以给观众一种“实时互动”的错觉&#xff0c;虽然不同弹幕的发送时间有所区别&#xff0c;但是其只会在视频中特定的一个时间点出现&#xff0c;因此在相同时刻发送的弹幕基本上也具有相同的主题&#xff0c;在参与评论时就会有与其他观众同时评论的错觉。 在国内…

零基础想转行学习Python,该如何学习,有学习路线分享吗?(2023年给初学者的建议)

Python属于一种面向对象、解释性的高级语言&#xff0c;它如今在众多领域都被应用&#xff0c;包括操作系统管理、Web开发、服务器运维的自动化脚本、科学计算、桌面软件、服务器软件(网络软件)、游戏等方面&#xff0c;且Python在今后将被大规模地应用到大数据和人工智能方面。…

MPI编程size总为1 解决方案

之前遇到的问题在这儿mpi编程 comm.Get_rank()全为0而comm.Get_size()全为1应该怎么办&#xff1f;_wennyLee的博客-CSDN博客 后来&#xff0c;我尝试了在pycharm的terminal中运行程序 mpiexec -n 4 test.py 但是又出现了新的问题↓ 然后为了解决”不是有效的 Win32 应用程序…