面试题 16.04. 井字游戏

2023-11-22 09:50
文章标签 面试题 游戏 16.04 井字

本文主要是介绍面试题 16.04. 井字游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

LeetCode: 面试题 16.04. 井字游戏

在这里插入图片描述


数组长度 1 <= length <= 100

暴力应该能过 >> 数据范围再大点 就 过不了了

暴力:
找到规律 >> 井字棋盘 >> 对角线 可以转换为两条直线 >> 以左上角为 (0,0) 坐标

所以从坐上到右下的对角线 的 直线方程就为: y = x

右上到左下的对角线的直线方程就为: y = -x + (len - 1)

不在上面两个直线方程里的坐标就不需要遍历对角线上的点 >> 因为其他点上的对角线必不能赢

通过定义两个 boolean 变量 >> 只需要进行一次 对角线的遍历 >> 之后就不需要再重复遍历 。



时间复杂度应该是 O(n^2) 往上



解法

  1. 暴力双循环 + 条件控制
  2. 求和思想 (行、列、对角线)
  3. 位运算

对角线优化
[i][i]
[i][len - 1 - i]



双重循环 + 条件控制

public String tictactoe(String[] board) {int sum = 0;int x = 0;int o = 0;int len = board.length;// 两条对角线boolean yx = true;boolean yxand = true;// O(n^2)for (int i = 0; i < len; i++) {for (int j = 0; j < len; j++) {char c = board[i].charAt(j);if(c == 'X' || c == 'O'){sum++;int k = 0;// 行for (k = 0; k < len; k++) {if(board[i].charAt(k) != c) break ;}if(k >= len) return c + "";// 列for (k = 0; k < len; k++) {if(board[k].charAt(j) != c) break ;}if(k >= len) return c + "";// 对角线// 稍微判断 中心点boolean b = (j != i) && (j != (len - 1 - i));if(b) continue ;if(yx && j == i){int row = 0;while (row < len){if(board[row].charAt(row++) != c){// 不相等,这条对角线玩完了yx = false;}}}if(yx && j == i) return c + "";if(yxand && j != i){int row = 0;for (int l = len - 1; l >= 0; l--) {if(board[row++].charAt(l) != c){yxand = false;}}}if(yxand && j != i) return c + "";}}}if(sum == len*len) return "Draw";return "Pending";}

在这里插入图片描述



上面的行、列判断还能小优化一下

空间换时间

定义行、列 boolean 数组 用来记录当前行、列是否可能赢得游戏

    boolean[] brow = new boolean[len];boolean[] bcol = new boolean[len];

若当前行 / 列有不相同的元素 >> 必不能赢,之后该行 / 该列是不需要重复判断了


if(!brow[i]) {// 行for (k = 0; k < len; k++) {if (board[i].charAt(k) != c) {brow[i] = true; break ;}}if (k >= len) return c + "";}if(!bcol[j]){// 列for (k = 0; k < len; k++) {if(board[k].charAt(j) != c) {bcol[j] = true;break ;}}if(k >= len) return c + "";}

在这里插入图片描述






求和的思想

// 求和的思想public String tictactoe(String[] board) {int len = board.length;int yxsum = 0;int yxandsum = 0;boolean isFull = true;for (int i = 0; i < len; i++) {int rowtemp = 0;int coltemp = 0;for (int j = 0; j < len; j++) {// 一行if(isFull && (board[i].charAt(j) == ' ' || board[j].charAt(i) == ' ')) isFull = false;rowtemp += board[i].charAt(j);coltemp += board[j].charAt(i);// 对角线if(i == j){yxsum += board[i].charAt(i);}if(j == (-i + len - 1)){yxandsum += board[i].charAt(j);}}// 一行if(rowtemp == len * 'X') return "X";if(rowtemp == len * 'O') return "O";// 一列if(coltemp == len * 'X') return "X";if(coltemp == len * 'O') return "O";}if(yxsum == len * 'X') return "X";if(yxsum == len * 'O') return "O";if(yxandsum == len * 'X') return "X";if(yxandsum == len * 'O') return "O";if (isFull) return "Draw";return "Pending";}

在这里插入图片描述





位运算

位运算 —> 异或

需要知道
当两个相同时 >> 异或结果为 false
当两个不同时 >> 异或结果为 true

在这里插入图片描述


当rowx等一直为 false 的时候 >> 就是一直为相同的 >> 当 被赋值为 true 后 >> 则这行 / 列 / 对角线 就不需要再进行计算了


public String tictactoe(String[] board) {int len = board.length;boolean yxx = false, yxo = false;boolean yxandx = false, yxando = false;boolean isFull = true;for (int i = 0; i < len; i++) {// 行、列boolean rowx = false, rowo = false;boolean colx = false, colo = false;for (int j = 0; j < len; j++) {if(isFull && (board[i].charAt(j) == ' ' || board[j].charAt(i) == ' ')) isFull = false;// 行if(!rowx) rowx =  ('X' ^ board[i].charAt(j)) != 0;if(!rowo) rowo = ('O' ^ board[i].charAt(j)) != 0;// 列if(!colx) colx = ('X' ^ board[j].charAt(i)) != 0;if(!colo) colo =  ('O' ^ board[j].charAt(i)) != 0;// 对角线if(!yxx) yxx = ('X' ^ board[i].charAt(i)) != 0;if(!yxo) yxo = ('O' ^ board[i].charAt(i)) != 0;if(!yxandx) yxandx = ('X' ^ board[i].charAt(len - 1 - i)) != 0;if(!yxando) yxando = ('O' ^ board[i].charAt(len - 1 - i)) != 0;}if(!rowx) return "X";if(!rowo) return "O";if(!colx) return "X";if(!colo) return "O";}if(!yxx) return "X";if(!yxo) return "O";if(!yxandx) return "X";if(!yxando) return "O";if(isFull) return "Draw";return "Pending";}

在这里插入图片描述

这篇关于面试题 16.04. 井字游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/409295

相关文章

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

一些其他面试题

阿里二面:那你来说说定时任务?单机、分布式、调度框架下的定时任务实现是怎么完成的?懵了。。_哔哩哔哩_bilibili 1.定时算法 累加,第二层每一个格子是第一层的总时间400 ms= 20 * 20ms 2.MQ消息丢失 阿里二面:高并发场景下引进消息队列有什么问题?如何保证消息只被消费一次?真是捏了一把汗。。_哔哩哔哩_bilibili 发送消息失败

zookeeper相关面试题

zk的数据同步原理?zk的集群会出现脑裂的问题吗?zk的watch机制实现原理?zk是如何保证一致性的?zk的快速选举leader原理?zk的典型应用场景zk中一个客户端修改了数据之后,其他客户端能够马上获取到最新的数据吗?zk对事物的支持? 1. zk的数据同步原理? zk的数据同步过程中,通过以下三个参数来选择对应的数据同步方式 peerLastZxid:Learner服务器(Follo

java常用面试题-基础知识分享

什么是Java? Java是一种高级编程语言,旨在提供跨平台的解决方案。它是一种面向对象的语言,具有简单、结构化、可移植、可靠、安全等特点。 Java的主要特点是什么? Java的主要特点包括: 简单性:Java的语法相对简单,易于学习和使用。面向对象:Java是一种完全面向对象的语言,支持封装、继承和多态。跨平台性:Java的程序可以在不同的操作系统上运行,称为"Write once,

火柴游戏java版

代码 /*** 火柴游戏* <p>* <li>有24根火柴</li>* <li>组成 A + B = C 等式</li>* <li>总共有多少种适合方式?</li>* <br>* <h>分析:</h>* <li>除去"+"、"="四根,最多可用火柴根数20根。</li>* <li>全部用两根组合成"1",最大数值为1111。使用枚举法,A和B范围在0~1111,C为A+B。判断</li>** @

国产游戏行业的崛起与挑战:技术创新引领未来

国产游戏行业的崛起与挑战:技术创新引领未来 近年来,国产游戏行业蓬勃发展,技术水平不断提升,许多优秀作品在国际市场上崭露头角。从画面渲染到物理引擎,从AI技术到服务器架构,国产游戏已实现质的飞跃。然而,面对全球游戏市场的激烈竞争,国产游戏技术仍然面临诸多挑战。本文将探讨这些挑战,并展望未来的机遇,深入分析IT技术的创新将如何推动行业发展。 国产游戏技术现状 国产游戏在画面渲染、物理引擎、AI

【Kubernetes】常见面试题汇总(三)

目录 9.简述 Kubernetes 的缺点或当前的不足之处? 10.简述 Kubernetes 相关基础概念? 9.简述 Kubernetes 的缺点或当前的不足之处? Kubernetes 当前存在的缺点(不足)如下: ① 安装过程和配置相对困难复杂; ② 管理服务相对繁琐; ③ 运行和编译需要很多时间; ④ 它比其他替代品更昂贵; ⑤ 对于简单的应用程序来说,可能不

【附答案】C/C++ 最常见50道面试题

文章目录 面试题 1:深入探讨变量的声明与定义的区别面试题 2:编写比较“零值”的`if`语句面试题 3:深入理解`sizeof`与`strlen`的差异面试题 4:解析C与C++中`static`关键字的不同用途面试题 5:比较C语言的`malloc`与C++的`new`面试题 6:实现一个“标准”的`MIN`宏面试题 7:指针是否可以是`volatile`面试题 8:探讨`a`和`&a`

Laravel 面试题

PHP模块 PHP7 和 PHP5 的区别,具体多了哪些新特性? 性能提升了两倍 结合比较运算符 (<=>) 标量类型声明 返回类型声明 try…catch 增加多条件判断,更多 Error 错误可以进行异常处理 匿名类,现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义 …… 了解更多查看文章底部链接 PHP7 新特性 为什么 PHP