华为OD机试 - 猜数字 - 暴力枚举(Python/JS/C/C++ 2024 E卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
一个人设定一组四码的数字作为谜底,另一方猜。
每猜一个数,出题者就要根据这个数字给出提示,提示以XAYB形式呈现,直到猜中位置。
其中X表示位置正确的数的个数(数字正确且位置正确),而Y表示数字正确而位置不对的数的个数。
例如,当谜底为8123,而猜谜者猜1052时,出题者必须提示0A2B。
例如,当谜底为5637,而猜谜者猜4931时,出题者必须提示1A0B。
当前已知N组猜谜者猜的数字与提示,如果答案确定,请输出答案,不确定则输出NA。
二、输入描述
第一行输入一个正整数N,0 < N < 100。
接下来N行,每一行包含一个猜测的数字与提示结果。
三、输出描述
输出最后的答案,答案不确定则输出NA。
四、测试用例
测试用例1
1、输入
3
1234 1A2B
5678 0A1B
9012 0A0B
2、输出
NA
3、说明
没有唯一符合所有提示的谜底,因此输出"NA"。
测试用例2
1、输入
2
0000 4A0B
1111 0A0B
2、输出
0000
3、说明
唯一符合所有提示的谜底是0000。
五、解题思路
本题的核心算法是穷举所有可能的四位数字组合(从0000到9999),即遍历所有可能的谜底。
对于每一个可能的谜底,逐一检查它是否能满足所有给定的提示。
1、为什么采用穷举搜索?
题目要求我们找出一个四位数的谜底,这意味着谜底的取值范围是从0000到9999,总共只有10000种可能。
对于计算机来说,遍历10000种可能性是一个非常可控的操作,执行时间相对较短。因此,使用穷举搜索可以在合理的时间内完成。
2、具体步骤:
- 枚举所有可能的谜底
- 谜底是一个四位数,范围从0000到9999,总共有10000种可能性。
- 我们需要遍历所有这些可能性,逐个验证它们是否符合所有提示。
- 验证每一个可能的谜底
- 对于每一个可能的谜底,我们需要根据所有的提示验证它是否符合条件。
- 提示格式为 XAYB,其中:
- X 表示猜测中有多少个数字在正确的位置上。
- Y 表示猜测中有多少个数字是正确的,但位置不对。
- 具体验证步骤如下:
- 对于每个提示,计算当前可能谜底与猜测之间的 X 和 Y 值。
- 将计算出的 X 和 Y 与输入的提示进行比较,如果不相等,则该可能的谜底无效。
3、复杂度分析
总共有10000个可能的四位数谜底。
对于每个可能的谜底,需要验证它是否符合N个提示。时间复杂度为 O(10000×N),在最坏情况下,N为100。
由于数据范围相对较小,穷举法可以在合理的时间内解决问题。
六、Python算法源码
# 导入必要的模块
import sysdef main():# 读取所有输入并按空白字符分割input = sys.stdin.read().split()index = 0# 读取猜测次数Nn = int(input[index])index += 1# 初始化猜测和提示的列表guesses = []hints = []# 读取每一组猜测和提示for _ in range(n):guesses.append(input[index])hints.append(input[index + 1])index += 2# 查找可能的谜底result = findPossibleAnswer(n, guesses, hints)# 输出结果print(result)def findPossibleAnswer(n, guesses, hints):possibleAnswer = None# 遍历所有可能的四位数字for i in range(10000):# 将数字格式化为四位字符串currentGuess = f"{i:04d}"isValid = True# 验证当前数字是否符合所有提示for j in range(n):# 生成当前猜测与谜底的提示hint = generateHint(currentGuess, guesses[j])# 如果提示不匹配,则当前数字不符合if hint != hints[j]:isValid = Falsebreak# 如果当前数字符合所有提示if isValid:if possibleAnswer is None:possibleAnswer = currentGuesselse:# 如果已经有一个符合的谜底,则不唯一,返回"NA"return "NA"# 返回唯一的谜底或"NA"return possibleAnswer if possibleAnswer is not None else "NA"def generateHint(answer, guess):A = 0 # 数字正确且位置正确的个数B = 0 # 数字正确但位置不对的个数# 标记已经匹配的数字answerUsed = [False] * 4guessUsed = [False] * 4# 先计算A值for i in range(4):if answer[i] == guess[i]:A += 1answerUsed[i] = TrueguessUsed[i] = True# 再计算B值for i in range(4):if not guessUsed[i]:for j in range(4):if not answerUsed[j] and guess[i] == answer[j]:B += 1answerUsed[j] = Truebreak# 返回提示字符串return f"{A}A{B}B"# 调用主函数
if __name__ == "__main__":main()
七、JavaScript算法源码
// 使用标准输入输出
process.stdin.resume();
process.stdin.setEncoding('utf8');let input = '';// 读取输入数据
process.stdin.on('data', function(chunk) {input += chunk;
});// 输入结束后处理数据
process.stdin.on('end', function() {// 按空白字符分割输入const tokens = input.trim().split(/\s+/);let index = 0;// 读取猜测次数Nconst n = parseInt(tokens[index++], 10);// 初始化猜测和提示的数组const guesses = [];const hints = [];// 读取每一组猜测和提示for(let i = 0; i < n; i++) {guesses.push(tokens[index++]);hints.push(tokens[index++]);}// 查找可能的谜底const result = findPossibleAnswer(n, guesses, hints);// 输出结果console.log(result);
});// 定义查找可能谜底的函数
function findPossibleAnswer(n, guesses, hints) {let possibleAnswer = null;// 遍历所有可能的四位数字for(let i = 0; i <= 9999; i++) {// 将数字格式化为四位字符串const currentGuess = i.toString().padStart(4, '0');let isValid = true;// 验证当前数字是否符合所有提示for(let j = 0; j < n; j++) {// 生成当前猜测与谜底的提示const hint = generateHint(currentGuess, guesses[j]);// 如果提示不匹配,则当前数字不符合if(hint !== hints[j]) {isValid = false;break;}}// 如果当前数字符合所有提示if(isValid) {if(possibleAnswer === null) {possibleAnswer = currentGuess;} else {// 如果已经有一个符合的谜底,则不唯一,返回"NA"return "NA";}}}// 返回唯一的谜底或"NA"return possibleAnswer !== null ? possibleAnswer : "NA";
}// 定义生成提示的函数
function generateHint(answer, guess) {let A = 0; // 数字正确且位置正确的个数let B = 0; // 数字正确但位置不对的个数// 标记已经匹配的数字const answerUsed = [false, false, false, false];const guessUsed = [false, false, false, false];// 先计算A值for(let i = 0; i < 4; i++) {if(answer[i] === guess[i]) {A += 1;answerUsed[i] = true;guessUsed[i] = true;}}// 再计算B值for(let i = 0; i < 4; i++) {if(!guessUsed[i]) {for(let j = 0; j < 4; j++) {if(!answerUsed[j] && guess[i] === answer[j]) {B += 1;answerUsed[j] = true;break;}}}}// 返回提示字符串return `${A}A${B}B`;
}
八、C算法源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>// 定义最大可能的谜底数量
#define MAX_POSSIBLE 10000// 函数声明
char* findPossibleAnswer(int n, char guesses[][5], char hints[][5]);
char* generateHint(char* answer, char* guess);int main(){int n;// 读取猜测次数Nscanf("%d", &n);// 动态分配猜测和提示的数组char (*guesses)[5] = malloc(n * sizeof(*guesses));char (*hints)[5] = malloc(n * sizeof(*hints));// 读取每一组猜测和提示for(int i = 0; i < n; i++) {scanf("%s %s", guesses[i], hints[i]);}// 查找可能的谜底char* result = findPossibleAnswer(n, guesses, hints);// 输出结果printf("%s\n", result);// 释放动态分配的内存free(guesses);free(hints);free(result);return 0;
}// 定义查找可能谜底的函数
char* findPossibleAnswer(int n, char guesses[][5], char hints[][5]) {char* possibleAnswer = NULL;// 遍历所有可能的四位数字for(int i = 0; i <= 9999; i++) {// 将数字格式化为四位字符串char currentGuess[5];sprintf(currentGuess, "%04d", i);int isValid = 1;// 验证当前数字是否符合所有提示for(int j = 0; j < n; j++) {// 生成当前猜测与谜底的提示char* hint = generateHint(currentGuess, guesses[j]);// 如果提示不匹配,则当前数字不符合if(strcmp(hint, hints[j]) != 0) {isValid = 0;free(hint);break;}free(hint);}// 如果当前数字符合所有提示if(isValid) {if(possibleAnswer == NULL) {possibleAnswer = malloc(5 * sizeof(char));strcpy(possibleAnswer, currentGuess);}else {// 如果已经有一个符合的谜底,则不唯一,返回"NA"free(possibleAnswer);return "NA";}}}// 返回唯一的谜底或"NA"if(possibleAnswer != NULL) {return possibleAnswer;}else {// 分配内存存储"NA"char* na = malloc(3 * sizeof(char));strcpy(na, "NA");return na;}
}// 定义生成提示的函数
char* generateHint(char* answer, char* guess){int A = 0; // 数字正确且位置正确的个数int B = 0; // 数字正确但位置不对的个数// 标记已经匹配的数字int answerUsed[4] = {0, 0, 0, 0};int guessUsed[4] = {0, 0, 0, 0};// 先计算A值for(int i = 0; i < 4; i++) {if(answer[i] == guess[i]) {A += 1;answerUsed[i] = 1;guessUsed[i] = 1;}}// 再计算B值for(int i = 0; i < 4; i++) {if(!guessUsed[i]) {for(int j = 0; j < 4; j++) {if(!answerUsed[j] && guess[i] == answer[j]) {B += 1;answerUsed[j] = 1;break;}}}}// 分配内存存储提示字符串char* hintStr = malloc(5 * sizeof(char));sprintf(hintStr, "%dA%dB", A, B);return hintStr;
}
九、C++算法源码
#include <bits/stdc++.h>
using namespace std;// 函数声明
string findPossibleAnswer(int n, vector<string> guesses, vector<string> hints);
string generateHint(string answer, string guess);int main(){int n;// 读取猜测次数Ncin >> n;// 初始化猜测和提示的向量vector<string> guesses(n);vector<string> hints(n);// 读取每一组猜测和提示for(int i = 0; i < n; i++) {cin >> guesses[i] >> hints[i];}// 查找可能的谜底string result = findPossibleAnswer(n, guesses, hints);// 输出结果cout << result << "\n";return 0;
}// 定义查找可能谜底的函数
string findPossibleAnswer(int n, vector<string> guesses, vector<string> hints){string possibleAnswer = "";bool multiple = false;// 遍历所有可能的四位数字for(int i = 0; i <= 9999; i++) {// 将数字格式化为四位字符串string currentGuess = to_string(i);while(currentGuess.length() < 4) currentGuess = "0" + currentGuess;bool isValid = true;// 验证当前数字是否符合所有提示for(int j = 0; j < n; j++) {// 生成当前猜测与谜底的提示string hint = generateHint(currentGuess, guesses[j]);// 如果提示不匹配,则当前数字不符合if(hint != hints[j]) {isValid = false;break;}}// 如果当前数字符合所有提示if(isValid){if(possibleAnswer.empty()) {possibleAnswer = currentGuess;}else {// 如果已经有一个符合的谜底,则不唯一,返回"NA"return "NA";}}}// 返回唯一的谜底或"NA"return possibleAnswer.empty() ? "NA" : possibleAnswer;
}// 定义生成提示的函数
string generateHint(string answer, string guess){int A = 0; // 数字正确且位置正确的个数int B = 0; // 数字正确但位置不对的个数// 标记已经匹配的数字vector<bool> answerUsed(4, false);vector<bool> guessUsed(4, false);// 先计算A值for(int i = 0; i < 4; i++) {if(answer[i] == guess[i]) {A += 1;answerUsed[i] = true;guessUsed[i] = true;}}// 再计算B值for(int i = 0; i < 4; i++) {if(!guessUsed[i]) {for(int j = 0; j < 4; j++) {if(!answerUsed[j] && guess[i] == answer[j]) {B += 1;answerUsed[j] = true;break;}}}}// 返回提示字符串return to_string(A) + "A" + to_string(B) + "B";
}
🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)
🏆本文收录于,华为OD机试真题(Python/JS/C/C++)
刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

相关文章:
华为OD机试 - 猜数字 - 暴力枚举(Python/JS/C/C++ 2024 E卷 100分)
华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试真题(Python/JS/C/C)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,…...
Flink触发器Trigger
前言 在 Flink 窗口计算模型中,数据先经过 WindowAssigner 分配窗口,然后再经过触发器 Trigger,Trigger 决定了一个窗口何时被 ProcessFunction 处理。每个 WindowAssigner 都有一个默认的 Trigger,如果默认的不满足需求…...
【操作系统的使用】Linux 系统环境变量与服务管理:设置与控制的艺术
文章目录 系统环境变量与服务管理:设置与控制的艺术一、系统环境变量的设置1.1 临时设置环境变量1.2 永久设置环境变量 二、服务启动类型的设置2.1 查看服务状态2.2 启动和停止服务2.3 设置服务的启动类型2.3.1 设置服务在启动时运行2.3.2 禁用服务在启动时运行2.3.…...
速盾:高防cdn配置中性能优化是什么?
高防CDN配置中的性能优化是指通过调整CDN配置以提升网站的加载速度、响应时间和用户体验。在进行性能优化时,需要考虑多个因素,包括CDN节点的选择和布置、缓存策略、缓存过期时间、预取和预加载、并发连接数和网络延迟等。 首先,CDN节点的选…...
Qt_软件添加版本信息
文章内容: 给生成的软件添加软件的版权等信息 #include <windows.h> //中文的话增加下面这一行 #pragma code_page(65001)VS_VERSION_INFO VERSIONINFO...
mallocfree和newdelete的区别
malloc\free和new\delete的区别 malloc/free new/delete 身份: 函数 运算符\关键字 返回值: void* 带类型的指针 参数: 字节个数(手动计算) 类型 自动计算字节数 处理数组: 手动计算数组总字节数 new 类型[数量] 扩容࿱…...
无锁队列实现(Michael Scott),伪代码与c++实现
一、Michael & Scoot 原版伪代码实现 structure pointer_t {ptr: pointer to node_t, count: unsigned integer}structure node_t {value: data type, next: pointer_t}structure queue_t {Head: pointer_t, Tail: pointer_t}initialize(Q: pointer to queue_t)node new_…...
猜数字小游戏
前言 猜数字游戏是一款经典且简单的互动游戏,常常用于提高逻辑思维能力和锻炼数学技巧。本文将深入探讨一段用 JavaScript 编写的猜数字游戏代码,帮助读者理解游戏的基本逻辑和实现方法。这段代码不仅适合初学者练习编程技巧,也是了解用户交…...
在Windows上搭建ChatTTS:从本地部署到远程AI音频生成全攻略
文章目录 前言1. 下载运行ChatTTS模型2. 安装Cpolar工具3. 实现公网访问4. 配置ChatTTS固定公网地址 前言 本篇文章主要介绍如何快速地在Windows系统电脑中本地部署ChatTTS开源文本转语音项目,并且我们还可以结合Cpolar内网穿透工具创建公网地址,随时随…...
如何用好 CloudFlare 的速率限制防御攻击
最近也不知道咋回事儿,群里好多站长都反映被CC 攻击了。有人说依旧是 PCDN 干的,但明月感觉不像,因为有几个站长被 CC 攻击都是各种动态请求(这里的动态请求指的是.php 文件的请求)。经常被攻击的站长们都知道,WordPress /Typecho 这类动态博客系统最怕的就是这种动态请求…...
Unity3D 立方体纹理与自制天空盒详解
立方体纹理和自制天空盒是游戏开发中常用的技术之一,可以为游戏增添更加丰富的视觉效果。在本文中,我们将详细介绍Unity3D中立方体纹理和自制天空盒的使用方法,并给出相应的代码实现。 对惹,这里有一个游戏开发交流小组ÿ…...
【工具】VSCODE下载,配置初次设置
打开 settings.json 文件,包含了 Visual Studio Code (VSCode) 中的各种用户配置。 {"files.associations": {"*.vue": "vue","*.wpy": "vue","*.wxml": "html","*.wxss": "…...
vue使用jquery的ajax,页面跳转
一、引入jquery依赖 打开终端更新npm npm install -g npm 更新完后引入输入npm install jquery 加载完后 在最外层的package.json文件中加入以下代码 配置好后导入jquery 设置变量用于接收服务器传输的数据 定义ajax申请数据 服务器的Controller层传输数据 (…...
基于微信小程序的社区二手交易系统的详细设计和实现(源码+lw+部署文档+讲解等)
项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…...
D34【python 接口自动化学习】- python基础之输入输出与文件操作
day34 文件关闭 学习日期:20241011 学习目标:输入输出与文件操作﹣-46 常见常新:文件的关闭 学习笔记: 文件关闭的内部工作过程 close()函数 with语句 常用的打开关闭文件 # 文件关闭 # 方式…...
【Linux系列】set -euo pipefail 命令详解
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
【Python爬虫实战】正则:中文匹配与贪婪非贪婪模式详解
🌈个人主页:https://blog.csdn.net/2401_86688088?typeblog 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html 目录 前言 一、匹配中文 (一)匹配单个中文字符 (二…...
保护数据安全:JS前端加密与PHP后端解密实战教程,让敏感信息更安全
保护数据安全:JS前端加密与PHP后端解密实战教程,让敏感信息更安全 在Web开发中,确保用户提交的敏感信息(如密码、手机号码等)的安全性是非常重要的。一种常见的做法是使用加密技术来保护这些数据,在传输过…...
72 分布式锁
72 分布式锁 什么是分布式锁 分布式锁 分布式 锁。那么分布式是指的什么呢?锁又是锁的谁呢?在业务开发中我们经常会听到分布式分布式的概念,分布式也很简单,通俗的来说就是你具有多个服务器,每个服务器上运行的程序…...
使用Windbg分析dump文件排查C++软件异常的一般步骤与要点分享
目录 1、概述 2、打开dump文件,查看发生异常的异常类型码 3、查看发生异常的那条汇编指令 3.1、汇编代码能最直接、最本真的反映出崩溃的原因 3.2、汇编指令中访问64KB小地址内存区,可能是访问了空指针 3.3、汇编指令中访问了很大的内核态的内存地…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
大数据驱动企业决策智能化的路径与实践
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:数据驱动的企业竞争力重构 在这个瞬息万变的商业时代,“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
五、jmeter脚本参数化
目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...
二叉树-144.二叉树的前序遍历-力扣(LeetCode)
一、题目解析 对于递归方法的前序遍历十分简单,但对于一位合格的程序猿而言,需要掌握将递归转化为非递归的能力,毕竟递归调用的时候会调用大量的栈帧,存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧,而非…...
