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

embedded/2024/11/21 15:10:10/

在这里插入图片描述

博客主页: [小ᶻZ࿆]
本文专栏: 蓝桥杯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.ppmy.cn/embedded/139364.html

相关文章

ssm126基于HTML5的出租车管理系统+jsp(论文+源码)_kaic

设计题目&#xff1a;出租车管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以…

【网络系统管理】Centos7——配置主从mariadb服务器案例(下半部分)

【网络系统管理】Centos7——配置主从mariadb服务器案例-CSDN博客 接上个文档&#xff0c;我们已经完成了主服务器创建数据库备服务器可以看到 一、在DBMS2查看信息 File&#xff0c;Position这两个字段的数据要记好&#xff0c;等一下需要用到 show master status; 二、在…

python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具

python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具 文章目录 python实战案例----使用 PyQt5 构建简单的 HTTP 接口测试工具项目背景技术栈用户界面核心功能实现结果展示完整代码总结 在现代软件开发中&#xff0c;测试接口的有效性与响应情况变得尤为重要。本文将指导…

机器学习算法模型系列——Adam算法

Adam是一种自适应学习率的优化算法&#xff0c;结合了动量和自适应学习率的特性。 主要思想是根据参数的梯度来动态调整每个参数的学习率。 核心原理包括&#xff1a; 动量&#xff08;Momentum&#xff09;&#xff1a;Adam算法引入了动量项&#xff0c;以平滑梯度更新的方向…

单片机_day8_时钟系统+定时器+PWM

目录 1.2 时钟源 1.3 STM32U5时钟源 1.4 时钟树 1.5 STM32CubeMX时钟树配置 2. Systick定时器 2.1 概念 2.2 工作原理 2.3 滴答定时器分析 3. TIM定时器 3.1 基本概念 3.2 STM32U5定时器 3.3 ​​​​​​​定时器框图 3.3.1 ​​​​​​​预分频器 3.3.2 ​​​​​​​…

php 使用mqtt

在 Webman 框架中使用 MQTT 进行消息的发布和订阅&#xff0c;你可以借助 PHP 的 MQTT 客户端库&#xff0c;比如 phpMQTT。以下是一个简单的示例&#xff0c;展示了如何在 Webman 中使用 MQTT 发布和订阅消息。 安装 phpMQTT 首先&#xff0c;你需要通过 Composer 安装 phpMQ…

统计机器学习——线性回归与分类

chapter2 线性回归与分类 例2.1 import pandas as pd data = pd.read_csv("../data/第2章数据/diabetes.csv",index_col=0)Index = data.columns xtitle = [index for index in Index if x. in index] x2title = [index for index in Index if x2. in index] xdata…

【实操之 图像处理与百度api-python版本】

1 cgg带你建个工程 如图 不然你的pip baidu-aip 用不了 先对图片进行一点处理 $ 灰度处理 $ 滤波处理 参考 import cv2 import os def preprocess_images(input_folder, output_folder):# 确保输出文件夹存在if not os.path.exists(output_folder):os.makedirs(output_fol…