华为OD机试 - 对称美学(Python/JS/C/C++ 2024 E卷 100分)

devtools/2024/9/29 19:01:42/

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

对称就是最大的美学,现在有一道关于对称字符串的美学。已知:

第1个字符串:R
第2个字符串:BR
第3个字符串:RBBR
第4个字符串:BRRBRBBR
第5个字符串:RBBRBRRBBRBBBRR

相信你已经发现规律了,没错!就是第i个字符串 = 第i-1号字符串取反 + 第i-1号字符串;
取反(R->B,B->R);

现在告诉你n和k,让你求得第n个字符串的第k个字符是多少。(k的编号从0开始)

二、输入描述

第一行输入一个T,表示有T组用例;

解析来输入T行,每行输入两个数字,表示n,k

1 ≤ T ≤ 100;
1 ≤ n ≤ 64;
0 ≤ k ≤ 2^(n-1) - 1;

三、输出描述

输出T行示例答案;

输出“blue”表示字符等于B;
输出“red”表示字符等于R;

注:输出字符Q区分大小写,请注意输出小写字符串,不带双引号。

四、测试用例

测试用例1:

1、输入

5
1 0
2 1
3 2
4 6
5 8

2、输出

red
red
blue
blue
blue

3、说明

第1个字符串:R -> 第0个字符为R
第2个字符串:BR -> 第1个字符为R
第3个字符串:RBBR -> 第2个字符为B
第4个字符串:BRRBRBBR -> 第6个字符为B
第5个字符串:RBBRBRRBBRBBBRR -> 第8个字符为B

测试用例2:

1、输入

3
1 0
2 0
3 3

2、输出

red
blue
red

3、说明

第1个字符串:R -> 第0个字符为R
第2个字符串:BR -> 第0个字符为B
第3个字符串:RBBR -> 第3个字符为R

五、解题思路

题目要求在生成的对称字符串中,找到第n个字符串的第k个字符。观察字符串的生成规律,我们发现每个字符串都是前一个字符串取反后与前一个字符串拼接而成的。这种递归生成的方式使得我们可以利用递归思想来解决问题,而无需实际生成字符串。

具体步骤如下:

  1. 递归基准:当n=1时,字符串为"R",所以第0个字符是’R’。
  2. 递归步骤:
    • 计算前一个字符串的长度,即mid = 2^(n-2)。
    • 如果k小于mid,说明第k个字符位于取反后的部分,此时递归查找第n-1个字符串的第k个字符,并取反。
    • 如果k大于等于mid,说明第k个字符位于前一个字符串的部分,此时递归查找第n-1个字符串的第(k - mid)个字符。
  3. 字符取反:‘R’取反为’B’,‘B’取反为’R’。
  4. 输出:根据查找到的字符,输出"red"或"blue"。

这种方法避免了直接生成可能非常大的字符串(n最大为64时字符串长度为2^63),提高了效率。

六、Python算法源码

python"># 导入sys模块用于读取输入
import sys# 定义递归函数,用于获取第n个字符串的第k个字符
def get_char(n, k):# 基准情况:n=1时,字符串只有一个字符'R'if n == 1:return 'R'# 计算前一个字符串的长度,即2^(n-2)mid = 1 << (n - 2)if k < mid:# 如果k在前半部分,取反后递归查找c = get_char(n - 1, k)return invert(c)  # 取反else:# 如果k在后半部分,直接递归查找return get_char(n - 1, k - mid)# 定义字符取反函数
def invert(c):return 'B' if c == 'R' else 'R'def main():# 读取所有输入input = sys.stdin.read().split()# 第一个数字是测试用例数量TT = int(input[0])# 初始化指针ptr = 1for _ in range(T):# 读取n和kn = int(input[ptr])k = int(input[ptr + 1])ptr += 2# 获取第n个字符串的第k个字符result = get_char(n, k)# 根据字符输出对应的颜色if result == 'R':print("red")else:print("blue")if __name__ == "__main__":main()

七、JavaScript算法源码

javascript">// 使用标准输入输出模块
const readline = require('readline');// 创建接口用于读取输入
const rl = readline.createInterface({input: process.stdin,output: process.stdout,terminal: false
});// 定义递归函数,用于获取第n个字符串的第k个字符
function getChar(n, k) {// 基准情况:n=1时,返回'R'if (n === 1) {return 'R';}// 计算前一个字符串的长度,即2^(n-2)const mid = 1 << (n - 2);if (k < mid) {// 如果k在前半部分,取反后递归查找const c = getChar(n - 1, k);return invert(c); // 取反} else {// 如果k在后半部分,直接递归查找return getChar(n - 1, k - mid);}
}// 定义字符取反函数
function invert(c) {return (c === 'R') ? 'B' : 'R';
}// 读取所有输入数据
let input = [];
rl.on('line', function(line){input = input.concat(line.trim().split(' '));
});rl.on('close', function(){// 第一个数字是测试用例数量Tlet T = parseInt(input[0]);let ptr = 1;for(let i = 0; i < T; i++){// 读取n和klet n = parseInt(input[ptr]);let k = BigInt(input[ptr + 1]); // 使用BigInt处理大数ptr += 2;// 获取第n个字符串的第k个字符let result = getChar(n, Number(k));// 根据字符输出对应的颜色if(result === 'R'){console.log("red");}else{console.log("blue");}}
});

八、C算法源码

#include <stdio.h>// 定义字符取反函数
char invert_char(char c) {return (c == 'R') ? 'B' : 'R';
}// 定义递归函数,用于获取第n个字符串的第k个字符
char get_char(int n, unsigned long long k) {// 基准情况:n=1时,返回'R'if (n == 1) {return 'R';}// 计算前一个字符串的长度,即2^(n-2)unsigned long long mid = 1ULL << (n - 2);if (k < mid) {// 如果k在前半部分,取反后递归查找char c = get_char(n - 1, k);return invert_char(c); // 取反}else {// 如果k在后半部分,直接递归查找return get_char(n - 1, k - mid);}
}int main() {int T;// 读取测试用例数量scanf("%d", &T);while(T--){int n;unsigned long long k;// 读取n和kscanf("%d %llu", &n, &k);// 获取第n个字符串的第k个字符char result = get_char(n, k);// 根据字符输出对应的颜色if(result == 'R') {printf("red\n");}else {printf("blue\n");}}return 0;
}

九、C++算法源码

#include <bits/stdc++.h>
using namespace std;// 定义字符取反函数
char invert_char(char c) {return (c == 'R') ? 'B' : 'R';
}// 定义递归函数,用于获取第n个字符串的第k个字符
char get_char(int n, unsigned long long k) {// 基准情况:n=1时,返回'R'if (n == 1) {return 'R';}// 计算前一个字符串的长度,即2^(n-2)unsigned long long mid = 1ULL << (n - 2);if (k < mid) {// 如果k在前半部分,取反后递归查找char c = get_char(n - 1, k);return invert_char(c); // 取反}else {// 如果k在后半部分,直接递归查找return get_char(n - 1, k - mid);}
}int main(){ios::sync_with_stdio(false);cin.tie(0);int T;// 读取测试用例数量cin >> T;while(T--){int n;unsigned long long k;// 读取n和kcin >> n >> k;// 获取第n个字符串的第k个字符char result = get_char(n, k);// 根据字符输出对应的颜色if(result == 'R') {cout << "red\n";}else {cout << "blue\n";}}return 0;
}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述


http://www.ppmy.cn/devtools/118841.html

相关文章

笔记整理—内核!启动!—linux应用编程、网络编程部分(6)随机数与proc文件系统

随机数实际上只存在于理论上&#xff0c;我们正常情况下接触到的随机数都是伪随机数。我们可用使用rand()连续多次调用返回一个伪随机数&#xff1b;使用srand()去设置随机数产生的种子。 rand()返回的值为0~rand_MAX之间的一个数&#xff0c;arand%6就返回0~6之间的一个值。只…

基于Java的宠物之家小程序 宠物服务小程序【源码+调试】

精彩专栏推荐订阅&#xff1a;在下方主页&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f496;&#x1f525;作者主页&#xff1a;计算机毕设木哥&#x1f525; &#x1f496; 文章目录 一、宠物之家小程…

【hot100-java】【零钱兑换】

R9-dp篇 class Solution {public int coinChange(int[] coins, int amount) {int ncoins.length;int [][] fnew int[n1][amount1];//除2防止下面1溢出Arrays.fill(f[0],Integer.MAX_VALUE/2);f[0][0]0;for (int i0;i<n;i){for (int c0;c<amount;c){if(c<coins[i]) f[i…

Python爬虫获取指定内容

要使用Python爬虫获取指定内容&#xff0c;通常需要以下几个步骤&#xff1a; 确定目标URL和请求头&#xff1a;首先&#xff0c;你需要明确你要爬取的网页的URL&#xff0c;并设置请求头&#xff08;headers&#xff09;来模拟浏览器请求&#xff0c;以避免被服务器识别为爬虫…

Linux下的git开篇第一文:git的意义

目录 1.git版本控制器 2.git gitee&&github 3.Linux中gitee的使用 &#xff08; 三板斧 git add git commit -m " " git push &#xff09; 4.git log 查看之前的修改信息 &#xff08;所有提交日志&#xff09; 5.git status 查看工作目录与本地…

“领航猿1号” 正式更名为 “AGI舰长”

亲爱的朋友们&#xff0c;很高兴的告诉大家&#xff1a; 我各个平台的账号昵称正式 由“领航猿1号” 更名为 “AGI舰长” 为什么更名&#xff1a; 为了更好的更专注的为大家提供关于“AI大模型全栈”的分享&#xff0c;特此以 AI 为关键元素更名账号名称&#xff0c;大家可以…

北斗三号多模对讲机TD70:公专网融合、数模一体、音视频调度,推动应急通信效能升级

随着国家对应急通信和精准定位技术的重视程度不断提高&#xff0c;相关技术和设备的研发与应用也得到了迅猛发展。特别是在边防巡逻、林业巡防、海上作业等领域&#xff0c;通信设备的可靠性和功能性直接关系到人员的生命安全和任务的成功完成。 近年来&#xff0c;我国政府高度…

梧桐数据库(WuTongDB):向量化查询优化器在实际实现中的技术细节和底层算法

关于向量化查询优化器的进一步细节&#xff0c;特别是在实际实现中的技术细节和底层算法&#xff0c;我们可以从几方面深入探讨&#xff1a;包括源码分析、具体算法优化和硬件层面的进一步利用。我将以ClickHouse和Apache Arrow为例&#xff0c;同时详细解释实现中的一些关键组…