【蓝桥杯C/C++】翻转游戏:多种实现与解法解析


文章目录

  • 💯题目
  • 💯问题分析
    • 解法一:减法法
    • 解法二:位运算解法
    • 解法三:逻辑非解法
    • 解法四:条件运算符解法
    • 解法五:数组映射法
    • 不同解法的比较
  • 💯小结


在这里插入图片描述


💯题目

在这里插入图片描述

在蓝桥镇,妮妮发明了一个新的游戏——翻转游戏。游戏中有一个开关,可以处于两种状态:开(用 1 表示)和关(用 0 表示)。妮妮发现,无论开关当前处于何种状态,他都可以通过一次操作使得开关的状态翻转。现在,妮妮告诉你开关当前的状态 x,他想知道如果他做一次操作,开关的状态会变成什么。你能帮助他解答这个问题吗?

输入格式:
输入仅一行,包含一个整数 x (0 ≤ x ≤ 1),表示开关当前的状态。

输出格式:
输出一行,表示如果妮妮做一次操作后,开关的状态。

样例输入:

0

样例输出:

1

在这个样例中,开关当前的状态是关(0),所以妮妮做一次操作后,开关的状态会变为开(1)。

运行限制:

语言最大运行时间最大运行内存
C++1s128M
C1s128M
Java2s128M
Python33s128M

💯问题分析

在这里插入图片描述

这个问题本质上是一个开关翻转问题,开关的状态只有两种:0 和 1。因此,我们可以很方便地通过数学运算、位运算、逻辑运算等多种方式实现翻转操作。接下来我们将以 C++ 为例,详细讲解每种方法的实现,并分析其思路和适用性。


解法一:减法法

这是最直观的一种解法,即利用数学运算来实现状态翻转。我们知道开关有两种状态:0 和 1。那么无论 x 的初始状态是 0 还是 1,都可以通过 1 - x 的方式得到翻转后的状态。
在这里插入图片描述

代码实现:

#include <iostream>
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin >> x;cout << 1 - x << endl;return 0;
}

思路分析:
对于当前状态 x

  • 如果 x0,那么 1 - x 的结果为 1
  • 如果 x1,那么 1 - x 的结果为 0

通过简单的减法操作,我们可以实现状态的翻转。这种解法简单明了,代码也非常简洁,易于理解。其计算量为常数级别,时间复杂度为 O ( 1 ) O(1) O(1),适合大多数场景使用。


解法二:位运算解法

利用位运算的异或操作(^)实现状态翻转也是一种很高效的方法。在二进制逻辑中,异或操作可以用来做翻转。

  • 0 ^ 1 = 1
  • 1 ^ 1 = 0

也就是说,当前状态与 1 做异或运算,就可以实现翻转操作。
在这里插入图片描述

代码实现:

#include <iostream>
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin >> x;cout << (x ^ 1) << endl;return 0;
}

思路分析:
在 C++ 中,^ 是按位异或运算符。当两个位不同的时候,结果为 1,相同则为 0。因此 x ^ 1 的效果是:

  • x0 时,0 ^ 1 得到 1
  • x1 时,1 ^ 1 得到 0

这种解法的优点在于,它利用了位运算的高效性。位运算的执行速度通常比数学运算更快,因此在需要极高性能的场合,位运算是不错的选择。


解法三:逻辑非解法

我们还可以通过逻辑非运算符 ! 来实现状态翻转。在 C++ 中,逻辑非运算符 ! 可以将布尔值的真假互换。

  • !0 == true,转为整数就是 1
  • !1 == false,转为整数就是 0
    在这里插入图片描述

代码实现:

#include <iostream>
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin >> x;cout << !x << endl;return 0;
}

思路分析:
逻辑非运算符可以将 0 变为 1,将 1 变为 0。虽然逻辑非运算符通常用于布尔逻辑判断,但在这种只有 01 两个状态的问题中,也可以巧妙地应用。利用逻辑非运算符的结果自动转换为整数,可以实现状态翻转。


解法四:条件运算符解法

  • 条件运算符(? :)是 C++ 中的一种三目运算符,可以根据条件的真假执行不同的操作。在这个问题中,我们可以根据 x 的值选择输出 10
    在这里插入图片描述

代码实现:

#include <iostream>
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin >> x;cout << (x == 0 ? 1 : 0) << endl;return 0;
}

思路分析:
该解法利用了条件运算符的特点:

  • x == 0 时,输出 1
  • x != 0 时,输出 0

这种方法的好处在于可读性很强,逻辑清晰明了,适合用来增强代码的可维护性。


解法五:数组映射法

  • 我们可以定义一个数组,将开关状态映射到它翻转后的状态。利用数组的索引,可以很方便地实现状态翻转。
    在这里插入图片描述

代码实现:

#include <iostream>
using namespace std;int main() {std::ios::sync_with_stdio(false);int x;cin >> x;int flip[2] = {1, 0}; // 定义翻转表cout << flip[x] << endl;return 0;
}

思路分析:
在这个解法中,我们定义了一个数组 flip,其中:

  • flip[0]1
  • flip[1]0

输入的状态 x(只能是 01)可以直接作为数组的索引,通过查表的方式得到翻转后的状态。这种解法的优点在于,扩展性较好。如果将来状态种类增多,只需要扩展数组即可,代码的改动最小。


不同解法的比较

在这里插入图片描述

  1. 减法法 (1 - x)

    • 优点:简单、直观,易于实现。
    • 缺点:不够灵活,对于状态数较多的场景不适用。
  2. 位运算解法 (x ^ 1)

    • 优点:利用位运算的高效性,性能优异。
    • 缺点:代码可能对某些不熟悉位运算的程序员不够直观。
  3. 逻辑非解法 (!x)

    • 优点:逻辑运算的方式实现状态翻转,简单易懂。
    • 缺点:逻辑非运算符通常用于布尔类型,可能会降低代码的可读性。
  4. 条件运算符解法 (x == 0 ? 1 : 0)

    • 优点:逻辑清晰,代码可读性强。
    • 缺点:代码稍显冗长,相较于其他方法不够简洁。
  5. 数组映射法 (flip[x])

    • 优点:扩展性好,可以方便地增加状态种类。
    • 缺点:对当前只有两种状态的情形而言,显得有些多余。

💯小结

  • 在这里插入图片描述
    如果代码简洁性和易读性是主要考虑因素,那么减法法 (1 - x) 是最优选择。
  • 如果需要追求极致的性能,或者对位运算熟悉且希望代码执行效率更高,位运算解法 (x ^ 1) 是不错的选择。
  • 如果问题需要在逻辑判断的基础上扩展为多状态翻转,数组映射法可以提高代码的扩展性和可维护性。.

在这里插入图片描述


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

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

相关文章

V-rep机器人仿真软件学习笔记

常用的机器人仿真软件有哪些&#xff1f;为什么选择V-rep&#xff1f; 目前常用的机器人物理仿真软件有Gazebo、V-rep、Webots等&#xff0c;这三款都是开源软件&#xff0c;自己使用过前两种&#xff0c;Gazebo配合ROS使用功能十分强大&#xff0c;但是要在Linux系统下使用&am…

第7章 硬件测试-7.1 硬件调试

第7章 硬件测试 7.1 硬件调试7.1.1 电路检查7.1.2 电源调试7.1.3 时钟调试7.1.4 主芯片及外围小系统调试7.1.5 存储器件和串口外设调试7.1.6 其他功能模块调试 测试是每项成功产品的必经环节。硬件测试是评估产品质量的重要方法&#xff0c;产品质量是公司的信誉和品牌象征&…

《深入理解 Spring MVC 工作流程》

一、Spring MVC 架构概述 Spring MVC 是一个基于 Java 的轻量级 Web 应用框架&#xff0c;它遵循了经典的 MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;将请求、响应和业务逻辑分离&#xff0c;从而构建出灵活可维护的 Web 应用程序。 在 Spring MV…

基于Java Springboot宿舍管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

LeetCode螺旋矩阵

快一个月没刷题了&#xff0c;最近工作有些忙&#xff0c;今天闲下来两小时&#xff0c;刷一道 题目描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4…

探索CompletableFuture:高效异步编程的利器

目录 一、CompletableFuture基本功能安利 二、CompletableFuture使用介绍 &#xff08;一&#xff09;任务创建使用 1.supplyAsync创建带有返回值的异步任务 2.runAsync创建没有返回值的异步任务 &#xff08;二&#xff09;异步回调使用 1.异步回调&#xff1a;thenApp…

java的强,软,弱,虚引用介绍以及应用

写在前面 本文看下Java的强&#xff0c;软&#xff0c;弱&#xff0c;虚引用相关内容。 1&#xff1a;各种引用介绍 顶层类是java.lang.ref.Reference,注意是一个抽象类&#xff0c;而不是接口&#xff0c;其中比较重要的引用队列ReferenceQueue就在该类中定义&#xff0c;子…

基于STM32的智能垃圾分类投递系统设计

目录 引言系统需求与设计目标硬件设计 3.1 核心控制模块 3.2 传感器模块 3.3 驱动模块 3.4 显示模块 3.5 通信模块软件设计 4.1 数据采集与处理 4.2 垃圾分类逻辑实现 4.3 状态显示与远程监控代码实现 5.1 数据采集与处理 5.2 分类逻辑与控制 5.3 状态显示与通信 5.4 主程序实…

手摸手6-创建前端应用

目录 手摸手6-创建前端应用简介命令 npm create vue 和 npm init vue3的区别 使用 Create-Vue 创建应用1、输入命令 npm create vue 创建应用2、输入命令 npm install 安装相关依赖3、输入命令 npm run dev 运行项目 项目结构 手摸手6-创建前端应用 简介 create-vue 是 vue 应…

第T8周:Tensorflow实现猫狗识别(1)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 具体实现 &#xff08;一&#xff09;环境 语言环境&#xff1a;Python 3.10 编 译 器: PyCharm 框 架: &#xff08;二&#xff09;具体步骤 from absl.l…

【MySQL】数据库基础

1.数据库基本认识 广义上来说数据库是长期存储在磁盘上的数据文件的集合&#xff0c;而MySQL是采用了C/S模式实现的一个网络服务&#xff0c;它由MySQL&#xff08;数据库客户端&#xff09; 、MySQLD &#xff08;数据库服务&#xff09;、磁盘上的数据库文件组成。MySQL服务是…

AWS IAM

一、介绍 1、简介 AWS Identity and Access Management (IAM) 是 Amazon Web Services 提供的一项服务&#xff0c;用于管理 AWS 资源的访问权限。通过 IAM&#xff0c;可以安全地控制用户、组和角色对 AWS 服务和资源的访问权限。IAM 是 AWS 安全模型的核心组成部分&#xf…

windows C#-异步编程场景(二)

等待多个任务完成 你可能发现自己处于需要并行检索多个数据部分的情况。 Task API 包含两种方法(即 Task.WhenAll 和 Task.WhenAny)&#xff0c;这些方法允许你编写在多个后台作业中执行非阻止等待的异步代码。 此示例演示如何为一组 User 捕捉 userId 数据。 private stati…

web——sqliabs靶场——第九关——时间盲注

什么是时间盲注 时间盲注是指基于时间的盲注&#xff0c;也叫延时注入&#xff0c;根据页面的响应时间来判断是否存在注入。 使用sqlmap不同的技术 sqlmap --technique 参数用来设置具体SQL注入技术 B: Boolean-based blind 基于布尔的忙逐步 E:Error-based 报错注入 U&am…

Vue所有图片预加载加上Token请求头信息、图片请求加载鉴权

环境 Vue2、“axios”: “0.18.1”、webpack&#xff1a;“4.46.0”、ant-design-vue: “1.7.8” 描述 项目对安全要求比较高&#xff0c;所有后台返回的图片加载时都要加上token。比如资源图片&#xff0c;拍照打卡的图片&#xff0c;都需要鉴权。如果不带上token参数&…

此电脑中的百度网盘图标无法删除解决方法2024/11/18

教程很详细&#xff0c;直接上步骤 对于这种情况&#xff0c;修改注册表是很麻烦的&#xff0c;眨眼睛在这里推荐这位大佬的开源软件MyComputerManager 点击跳转MyComputerManager下载链接

【模型级联】YOLO-World与SAM2通过文本实现指定目标的零样本分割

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

Postman之变量操作

系列文章目录 Postman之变量操作 1.pm.globals全局变量2.pm.environment环境变量3.pm.collectionVariables集合变量4.pm.variables5.提取数据-设置变量-进行参数化串联使用 postman中分为全局变量、环境变量、集合变量、和普通变量 分别使用pm.globals、pm.environment、pm.co…

linux 常用命令指南(存储分区、存储挂载、docker迁移)

前言&#xff1a;由于目前机器存储空间不够&#xff0c;所以‘斥巨资’加了一块2T的机械硬盘&#xff0c;下面是对linux扩容的一系列操作&#xff0c;包含了磁盘空间的创建、删除&#xff1b;存储挂载&#xff1b;docker迁移&#xff1b;anaconda3迁移等。 一、存储分区 1.1 …

python读取Oracle库并生成API返回Json格式

一、安装必要的库 首先&#xff0c;确保已经安装了以下库&#xff1a; 有网模式 pip install flask pip install gevent pi install cx_Oracle离线模式&#xff1a; 下载地址&#xff1a;https://pypi.org/simple/flask/ # a. Flask Werkzeug-1.0.1-py2.py3-none-any.whl J…