【华为OD机试真题】120、猜数字 | 机试真题+思路参考+代码解析(C语言、C++、Java、Py、JS)

本文是华为OD在线测试的一道猜数字题目,提供了C、C++、Java、Python和JS五种语言的解题思路和代码实现。题目要求根据出题者的提示,判断是否存在唯一答案,输出答案或'NA'。文章详细解释了如何通过遍历和比较所有可能的数字,判断是否满足所有猜测条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


🍂个人博客首页: KJ.JK
 
🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C语言、C++、Java、Python、JS语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习


一、题目


🎃题目描述

一个人设定一组四码的数字作为谜底, 另一方猜。
 
每猜一个数,出数者就要根据这个数字给出提示,提示以XAYB形式呈现,直到猜中位置。
 
其中X表示位正确的数的个数(数字正确且位置正确),而Y表示数字正确而位置不对的数的个数。
 
例如,当谜底为8123,而猜谜者猜1052时,出题者必须提示0A2B。
 
例如,当谜底为5637, 而猜谜者才4931时,出题者必须提示1A0B。
 
当前已知N组猜谜者猜的数字与提示,如果答案确定,请输出答案,不确定则输出NA。


🎃输入输出

输入
第一行输入一个正整数,0

<think>我们被要求生成与华为ODC卷相关的问题及解答,但注意用户希望准备相关内容,因此我们需要提供一些典型的题目和解答示例。同时,用户提供了几个引用,其中引用[1]提到了华为OD的题库和刷题列表,引用[2]和[3]是具体的题目示例(吃火锅和考勤信息)。因此,我们可以参考这些题目类型,给出C语言的解答。 由于用户要求生成相关问题,我们将在回答后生成几个相关问题。 但是,注意用户要求回答结构清晰,逐步解决问题,并保证真实可靠。因此,我们将选择两个典型的题目(一个简单,一个中等难度)进行详细解答,包括题目描述、输入输出说明、解题思路和C语言代码。 题目选择: 1. 一个简单的题目,比如数组或字符串操作。 2. 一个中等难度的题目,比如动态规划或贪心算法。 由于引用中提到了“考勤信息”和“导师请吃火锅”,我们可以选择其中一个作为示例,再另选一个常见题目。 我们选择: 1. 考勤信息(来自引用[3])作为第一个题目,因为它是字符串处理,比较典型。 2. 另一个题目选择“导师请吃火锅”(引用[2]),但注意引用[2]的标题是C语言,但内容没有给出题目描述。因此,我们可能需要根据标题猜测题目,或者从其他渠道获取类似题目的描述。但为了准确,我们参考引用[2]的标题,题目描述为“导师请吃火锅”,根据经验,这类题目可能是贪心或模拟题。 由于引用[2]没有给出具体描述,而引用[3]有详细描述,因此我们以引用[3]的考勤信息为例,再自行选择一个常见的简单题目:两数之和(作为数组题的代表)。 但注意:用户要求的是C卷题目,且我们引用的内容中,考勤信息是E卷,但用户说可以复用,所以我们可以使用。 因此,我们给出两个题目: 题目1:考勤信息(字符串处理) 题目2:两数之和(数组,哈希表) 但是,注意用户要求的是C卷,而两数之和是经典题目,在中经常出现。另外,我们也可以考虑选择“导师请吃火锅”,但因为没有具体描述,我们暂时不选。 因此,我们决定: 1. 考勤信息(详细描述见引用[3]) 2. 两数之和(经典题目,描述如下:) 题目2:两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。 输入格式: 第一行输入一个整数n,表示数组长度 第二行输入n个整数,表示数组元素 第三行输入一个整数target,表示目标值 输出格式: 输出两个整数,表示对应元素的下标(下标从0开始),用一个空格隔开 示例输入: 4 2 7 11 15 9 示例输出: 0 1 现在,我们分别给出这两个题目的C语言解答。 注意:由于用户要求使用中文回答,并且按照系统级指令,数学公式使用$...$,独立公式使用$$...$$,但本题解答中可能没有数学公式,所以可以忽略。另外,在回答中引用的段落末尾添加引用标识,如[^1]。 开始解答:</think>### 华为ODC卷题目及解答示例 #### 题目1:考勤信息(字符串处理) **题目描述** 输入用户的考勤数据字符串(每条记录包含多个单词,如"present"、"absent"等),判断是否能获得考勤奖。规则如下: 1. 缺勤("absent")次数不超过1次; 2. 不能连续迟到("late")或早退("leaveearly"); 3. 任意连续7次考勤中,缺勤/迟到/早退总数不超过3次。 **输入格式** 第一行为记录条数 $n$,接下来 $n$ 行每行为一个考勤字符串(单词间用空格分隔)。 **输出格式** 对每条记录输出"true"或"false"。 **示例输入** ``` 2 present present present present absent present leaveearly present ``` **示例输出** ``` true false ``` **解题思路** 1. **分割字符串**:按空格拆分每条记录的考勤单词。 2. **遍历检查**: - 统计缺勤次数,若≥2则不合格。 - 检查连续迟到/早退:若相邻两次均为"late"或"leaveearly",则不合格。 - 滑动窗口检查:对任意连续7次考勤,统计缺勤/迟到/早退总数,若>3则不合格。 **C语言代码实现** ```c #include <stdio.h> #include <string.h> #include <stdbool.h> bool checkAttendance(char* records[], int len) { int absentCnt = 0; int lastLateEarly = -2; // 记录上一次迟到/早退的位置 for (int i = 0; i < len; i++) { // 规则1:缺勤不超过1次 if (strcmp(records[i], "absent") == 0) { absentCnt++; if (absentCnt >= 2) return false; } // 规则2:连续迟到/早退检查 if (strcmp(records[i], "late") == 0 || strcmp(records[i], "leaveearly") == 0) { if (lastLateEarly == i - 1) return false; // 连续出现 lastLateEarly = i; } // 规则3:滑动窗口检查(连续7次) if (i >= 6) { int count = 0; for (int j = i - 6; j <= i; j++) { if (strcmp(records[j], "absent") == 0 || strcmp(records[j], "late") == 0 || strcmp(records[j], "leaveearly") == 0) { count++; } } if (count > 3) return false; } } return true; } int main() { int n; scanf("%d", &n); getchar(); // 消耗换行符 char records[100][10000]; // 假设每条记录最大长度10000 for (int i = 0; i < n; i++) { fgets(records[i], 10000, stdin); records[i][strcspn(records[i], "\n")] = '\0'; // 移除换行符 } for (int i = 0; i < n; i++) { char* token = strtok(records[i], " "); char* arr[1000]; int idx = 0; while (token != NULL) { arr[idx++] = token; token = strtok(NULL, " "); } printf("%s\n", checkAttendance(arr, idx) ? "true" : "false"); } return 0; } ``` --- #### 题目2:两数之和(数组+哈希) **题目描述** 给定整数数组 `nums` 和目标值 `target`,在数组中找出和为目标值的两个整数,返回它们的下标(下标从0开始)。 **输入格式** - 第一行:数组长度 $n$ - 第二行:$n$ 个整数 - 第三行:目标值 $target$ **输出格式** 两个下标(空格分隔),保证唯一解。 **示例输入** ``` 4 2 7 11 15 9 ``` **示例输出** ``` 0 1 ``` **解题思路** 使用**哈希表**优化查找: 1. 遍历数组,计算补数 $complement = target - nums[i]$。 2. 若补数存在于哈希表中,直接返回结果。 3. 将当前元素值及其下标存入哈希表。 **C语言代码实现** ```c #include <stdio.h> #include <stdlib.h> #define SIZE 10007 // 哈希表大小(质数减少冲突) typedef struct Node { int key; int value; struct Node* next; } Node; Node* hashTable[SIZE]; // 哈希函数 int hash(int key) { return abs(key) % SIZE; } // 插入键值对 void insert(int key, int value) { int idx = hash(key); Node* newNode = (Node*)malloc(sizeof(Node)); newNode->key = key; newNode->value = value; newNode->next = hashTable[idx]; hashTable[idx] = newNode; } // 查找键 Node* search(int key) { int idx = hash(key); Node* cur = hashTable[idx]; while (cur != NULL) { if (cur->key == key) return cur; cur = cur->next; } return NULL; } int main() { int n, target; scanf("%d", &n); int* nums = (int*)malloc(n * sizeof(int)); for (int i = 0; i < n; i++) { scanf("%d", &nums[i]); } scanf("%d", &target); // 初始化哈希表 for (int i = 0; i < SIZE; i++) hashTable[i] = NULL; for (int i = 0; i < n; i++) { int complement = target - nums[i]; Node* node = search(complement); if (node != NULL) { printf("%d %d\n", node->value, i); break; } insert(nums[i], i); } free(nums); return 0; } ``` --- ### 相关问题 1. 如何优化考勤信息中的滑动窗口检查效率? 2. 两数之和问题中如何处理多个解的情况? 3. 华为ODC卷常考哪些算法题型? 4. 哈希表冲突的解决方法有哪些?在C语言中如何实现? [^1]: 2024华为ODC+D卷真题目录汇总(C C++ Java Py JS) [^2]: 华为OD真题E卷 C语言:导师请吃火锅 [^3]: 华为OD真题E卷 C语言:考勤信息
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KJ.JK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值