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

news2024/9/29 19:37:18

在这里插入图片描述

华为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算法源码

# 导入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()
    # 第一个数字是测试用例数量T
    T = int(input[0])
    # 初始化指针
    ptr = 1
    for _ in range(T):
        # 读取n和k
        n = 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算法源码

// 使用标准输入输出模块
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(){
    // 第一个数字是测试用例数量T
    let T = parseInt(input[0]);
    let ptr = 1;
    for(let i = 0; i < T; i++){
        // 读取n和k
        let 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和k
        scanf("%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和k
        cin >> 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.coloradmin.cn/o/2177640.html

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

相关文章

深度学习------------------------RNN(循环神经网络)

目录 潜变量自回归模型循环神经网络困惑度梯度剪裁循环神经网络的从零开始实现初始化循环神经网络模型的模型参数初始化隐藏状态创建一个类来包装这些函数该部分总代码 定义预测函数该部分总代码 梯度裁剪定义一个函数在一个迭代周期内训练模型训练函数 循环神经网络的简洁实现…

JS设计模式之观察者模式:观察者与可观察对象的巧妙互动

一. 前言 在前端开发中&#xff0c;我们经常会遇到需要对用户的操作进行响应的场景&#xff0c;例如页面上的按钮点击、输入框内容变化等。为了实现这种响应式的设计&#xff0c;我们可以使用观察者模式来解耦各个组件之间的依赖关系。 本文将详细介绍观察者模式的原理和实现…

【FaceFusion3.0.0】全新升级,重磅发布!

FaceFusion 3.0.0 版本引入了许多新特性和改进&#xff0c;其中包括&#xff1a; 重新设计架构&#xff0c;使所有操作都作为“任务”进行处理。在面部交换功能中引入像素增强(pixel boost)。向面部检测器添加多角度处理功能。引入年龄修正处理器(age modifier processor)。引…

前端学习笔记-JS进阶篇-02

构造函数&数据常用函数 1、深入对象 1.1、创建对象三种方式 1. 利用对象字面量创建对象 2. 利用new Object 创建对象 3. 利用构造函数创建对象 1.2、构造函数 构造函数&#xff1a;是一种特殊的函数&#xff0c;主要用来初始化对象 使用场景&#xff1a;常规的{...} 语…

MES系统实现制造业生产自动化、智能化与透明化

万界星空科技MES系统通过集成硬件和软件&#xff0c;实现对生产过程的实时监控、数据采集、任务调度、资源分配、质量控制、文档管理等功能&#xff0c;旨在优化企业的生产流程&#xff0c;提高生产效率&#xff0c;降低成本&#xff0c;并确保产品质量。涵盖了离散制造、流程制…

RK3588主板PCB设计学习

DCDC电路可以直接参考数据手册&#xff1a; 电源输出3A&#xff0c;回流GND也应该是3A&#xff0c;回流路径和输出路径的电流是一致的&#xff0c;不要输出路径布线很粗&#xff0c;GND回流路径很细&#xff0c;并且应该保证回流面积最小&#xff1a; 这一点讲的很到位&#xf…

一款基于 RBAC 的 Net8 后台管理框架,权限管理,前后台分离,支持多站点单点登录(附源码)

前言 在当今快速发展的互联网时代&#xff0c;一款强大的后台管理系统对于提升工作效率、简化cao作流程具有重要意义。然而&#xff0c;在众多开源项目中&#xff0c;大部分是以Java语言编写的&#xff0c;这对于专注于.NET平台的开发者来说&#xff0c;存在一定的使用门槛。 …

云+AI时代下,Alibaba Cloud Linux 如何进一步演进?

编者按&#xff1a;云AI 浪潮势不可挡&#xff0c;服务器操作系统如何进一步演进&#xff1f;阿里云智能集团高级技术专家张金利在 2024 云栖大会操作系统开源专场上&#xff0c;分享了《Alibaba Cloud Linux 技术路线演进思考》。内容见下&#xff1a; &#xff08;图/张金利&…

MacOS安装MindSpore(2024年最新)

大家好&#xff0c;我是邵奈一&#xff0c;一个不务正业的程序猿、正儿八经的斜杠青年。 1、世人称我为&#xff1a;被代码耽误的诗人、没天赋的书法家、五音不全的歌手、专业跑龙套演员、不合格的运动员… 2、这几年&#xff0c;我整理了很多IT技术相关的教程给大家&#xff0…

项目管理系统中的风险管理:如何识别和应对项目风险?

在现代项目管理中&#xff0c;风险管理是确保项目成功的关键因素之一。无论是技术、资源还是市场的变化&#xff0c;风险无处不在。有效的风险管理能够帮助团队识别潜在问题并制定应对策略&#xff0c;从而避免项目延误和预算超支。项目管理系统在这一过程中扮演着重要角色&…

从 TCP Reno 经 BIC 到 CUBIC

重读 TCP拥塞控制算法-从BIC到CUBIC 以及 cubic 的 tcp friendliness 与拐点控制 这两篇文章&#xff0c;感觉还是啰嗦了&#xff0c;今日重新一气呵成这个话题。 reno 线性逼近管道容量 Wmax&#xff0c;相当于一次查询(capacity-seeking)&#xff0c;但长肥管道从 0.5*Wmax …

试填+组合数学,CF 1648C - Tyler and Strings

目录 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 二、解题报告 1、思路分析 2、复杂度 3、代码详解 一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1648C - Tyler and Strings 二、解题报告 1、思路分析 考虑枚举相同前缀…

MySQL约束:外键约束

下面先创建两张表用来作为实验样例 1.创建dept表 create table dept(id int auto_increment comment ID primary key,name varchar(50) not null comment 部门名称 ) comment 部门表;INSERT INTO dept (id, name) VALUES (1, 研发部), (2, 市场部), (3, 财务部), (4, 销售部…

【C语言软开面经】

C语言软开面经 malloc calloc realloc free动态分配内存malloccalloc函数&#xff1a;realloc 函数&#xff1a;free函数&#xff1a; 堆栈-内存分区栈区&#xff08;Stack&#xff09;&#xff1a;堆区&#xff08;Heap&#xff09;&#xff1a;全局&#xff08;静态&#xff…

哪个待办事项提醒软件推荐?待办事项提醒软件哪个合适?

在快节奏的现代生活中&#xff0c;我们每个人每天都会被各种待办事项所包围。从工作计划到个人生活&#xff0c;从学习任务到家庭琐事&#xff0c;这些事项往往繁杂且紧急&#xff0c;稍不留神就可能错过重要的截止日期。因此&#xff0c;选择一款合适的待办事项提醒软件&#…

Docker-2.如何保存数据退出

在使用Docker时&#xff0c;我们常常需要修改容器中的文件&#xff0c;并且希望在容器重启后这些修改能够得到保留。 0.简介 使用Docker时有一个需要注意的问题&#xff1a;当你修改了容器中的文件后&#xff0c;重启容器后这些修改将会被重置&#xff0c;深入研究这个问题。 …

如何高效运营知识产权,实现企业价值最大化?

知识产权的运营管理是指企业对其所拥有的专利、商标、著作权等知识产权进行规划、运用、保护和管理的一系列活动。这些活动旨在最大化知识产权的价值&#xff0c;促进企业的技术创新和市场竞争力的提升。通过有效的知识产权运营管理&#xff0c;企业可以实现技术成果的快速转化…

猝发传输和非猝发传输

猝发传输和非猝发传输是两种不同的数据传输方式&#xff0c;主要区别在于数据传输的连续性以及数据包的发送方式。 猝发传输 (Burst Transmission): 定义: 猝发传输是指在一段时间内&#xff0c;大量数据包集中发送&#xff0c;然后在一段时间内没有数据传输&#xff0c;这种…

全流程SWAP农业模型数据制备、敏感性分析及气候变化影响技术应用

SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型&#xff0c;它综合考虑了土壤-水分-大气以及植被间的相互作用&#xff1b;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程&#xff0c;使其能够精确的模拟土壤中水分的运动&#xff0c;而且耦合了W…

HAL+M4学习记录_1

一、简介 基于Arm Cortex-M4的STM32F4 MCU系列采用了意法半导体的NVM工艺和ART Accelerator™&#xff0c;在高达180 MHz的工作频率下通过闪存执行时其处理性能达到225 DMIPS/608 CoreMark&#xff0c;这是迄今所有基于Cortex-M内核的微控制器产品所达到的最高基准测试分数。 这…