首页 > 其他分享 >华为机试HJ30 字符串合并处理

华为机试HJ30 字符串合并处理

时间:2024-11-08 18:15:46浏览次数:3  
标签:字符 排序 int str1 len 华为 字符串 机试 HJ30

首先看一下题

描述

按照指定规则对输入的字符串进行处理。

详细描述:

第一步:将输入的两个字符串str1和str2进行前后合并。如给定字符串 "dec" 和字符串 "fab" , 合并后生成的字符串为 "decfab"

第二步:对合并后的字符串进行排序,要求为:下标为奇数的字符和下标为偶数的字符分别从小到大排序。这里的下标的意思是字符在字符串中的位置。注意排序后在新串中仍需要保持原来的奇偶性。例如刚刚得到的字符串“decfab”,分别对下标为偶数的字符'd'、'c'、'a'和下标为奇数的字符'e'、'f'、'b'进行排序(生成 'a'、'c'、'd' 和 'b' 、'e' 、'f'),再依次分别放回原串中的偶数位和奇数位,新字符串变为“abcedf”

第三步:对排序后的字符串中的'0'~'9'、'A'~'F'和'a'~'f'字符,需要进行转换操作。

转换规则如下:

对以上需要进行转换的字符所代表的十六进制用二进制表示并倒序,然后再转换成对应的十六进制大写字符(注:字符 a~f 的十六进制对应十进制的10~15,大写同理)。

如字符 '4',其二进制为 0100 ,则翻转后为 0010 ,也就是 2 。转换后的字符为 '2'。

如字符 ‘7’,其二进制为 0111 ,则翻转后为 1110 ,对应的十进制是14,转换为十六进制的大写字母为 'E'。

如字符 'C',代表的十进制是 12 ,其二进制为 1100 ,则翻转后为 0011,也就是3。转换后的字符是 '3'。

根据这个转换规则,由第二步生成的字符串 “abcedf” 转换后会生成字符串 "5D37BF"。

数据范围:输入的字符串长度满足 1≤n≤100 

输入描述:

样例输入两个字符串,用空格隔开。

输出描述:

输出转化后的结果。

示例1

输入:

dec fab

输出:

5D37BF

示例2

输入:

ab CD

输出:

3B5D

说明:

合并后为abCD,按奇数位和偶数位排序后是CDab(请注意要按ascii码进行排序,所以C在a前面,D在b前面),转换后为3B5D          

示例3

输入:

123 15

输出:

88C4A

一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.按照指定规则对输入的字符串进行处理。

2.详细描述:(分三个步骤)

3.第一步:将输入的两个字符串str1和str2进行前后合并。

4.如给定字符串“dec”和字符串“fab”,合并后生成的字符串为“decfab”

5.第二步:对合并后的字符串进行排序,要求为:

6.下标为奇数的字符和下标为偶数的字符分别从小到大排列。

7.这里的下标的意思是字符在字符串中的位置。

8.注意排序后在新串中仍需要保持原来的奇偶性。

9.例如刚刚得到的字符串“decfab”,分别对下标为偶数的字符‘d’,‘c’,‘a’

和下标为奇数的字符‘e’,‘f’,‘b’进行排序

(生成‘a’,‘c’,‘d’和‘b’,‘e’,‘f’)

10.再分别放回原串中的偶数位和奇数位,

11.新字符串变为“abcedf”

12.第三步:对排序后的字符串中的‘0’~‘9’、‘A’~‘F’和‘a’~‘f’字符,需要进行转换操作

13.转换规则如下:对以上需要进行转换的字符所代表的十六进制用二进制表示并倒序

14.然后再转换成对应的十六进制大写字符

(注:字符a~f的十六进制对应十进制的10~15,大写同理)。

15.如字符‘4’,其二进制为0100,则翻转后为0010,也就是2.转换后的字符为‘2’。

如字符‘7’,其二进制为0111,则翻转后为1110,对应的十进制是14,转换为十六进制的大写字母为‘E’。

如字符‘C’,代表的十进制是12,其二进制为1100,则翻转后为0011,也就是3.转换后的字符是‘3’。

根据这个转换规则,由第二步生成的字符串“abcedf”转换后会生成字符串“5D37BF”。

16.数据范围:输入的字符串长度满足n大于等于1小于等于100

17.输入描述:样例输入两个字符串,用空格隔开。

18.输出描述:输出转化后的结果。

二、解题思路

1.首先我们先定义两个字符串char str1[201];char str2[101];

2.然后我们将输入读取到字符串中

scanf("%s %s", str1, str2);

3.然后我们执行步骤1,为此我们需要函数strcat(str1,str2);

我们的strcat函数会将str2的内容复制到str1后面

4.完成字符串合并后我们执行步骤2

5.我们要分别对下标为偶数和奇数的字符进行排序(注意要按ascii码排序,所以大写字母在小写字母前面)

我们先对奇数字符排序

排序之前我们测量一下合并后的字符串长度int len = strlen(str1);

for(int i = 0; i < len; i = i + 2) 

if(i >= len) break;

遍历奇数字符

for(int j = i + 2; j < len; j = j + 2)

if(j >= len) break;

每个奇数字符和后面的字符做对比,如果遇到比自己的ascii码小的字符,就交换位置(将ascii码小的放在前面)

if(str1[j] < str1[i]) {

char temp = str1[i];

str1[i] = str1[j];

str1[j] = temp;

}

然后我们对偶数字符排序

for(int i = 1; i < len; i = i + 2)

if(i >= len) break;

for(int j = i + 2; j < len; j = j + 2)

if(j >= len) break;

if(str1[j] < str1[i]) {

char temp = str1[i];

str1[i] = str1[j];

str1[j] = temp;

}

6.我们执行第三步,对于排序后的字符进行转换操作

将我们的每一个字符,当成十六进制,并计算出它的二进制表示,然后将二进制的表示倒序,然后再转换成相应的十六进制

因为二进制从0000到1111是十进制的0到15(1+2+4+8),十六进制的0到F

所以我们不用担心有无法转换的情况发生。

那么具体如何操作呢

for(int i = 0; i < len; i++)

首先我们需要计算我们字符的二进制表示

我们如果要想知道二进制表示我们需要先得到十进制表示

我们用一个int num;表示十进制

所以我们对字符做判断

if(c >= '0' && c <= '9')如果我们这个字符是‘0’-‘9’之间的字符(ascii码在‘0’至‘9’)

那么我们这个字符是个数字我们可以直接给num赋值

num = c - '0';

if(c >= 'a' && c <= 'f')如果我们这个字符是一个小写字母

num = c - 'a';

if(c >= 'A' && c <= 'F')如果是大写字母

num = c - 'A';

这样我们就得到了我们字符相对应的十进制数字

接下来我们转换成二进制(直接储存为翻转后的形式);

int binary[4];

for(int i = 0; i < 4; i++){

binary[i] = num % 2;

num /= 2;

}

然后我们将翻转后的二进制转换为十进制

int newnum = 0;

for(int i = 0; i < 4; i++){

newnum += pow(binary[i], 2)

}

然后我们得到我们转换后的字符

if(newnum <= 9){

c = newnum + '0';

} else {

c = newnum - 10 + 'A';

}

三、具体步骤

使用的语言是C,有一点要注意的是,如果是非十六进制能识别的字符,我们不做处理。

#include <stdio.h>
#include <string.h>
void stepthree(char *c) {
    int num;
    if(*c >= '0' && *c <= '9') {
        num = *c - '0';
    } else if (*c >= 'a' && *c <= 'f') {
        num = *c - 'a' + 10;
    } else if (*c >= 'A' && *c <= 'F') {
        num = *c - 'A' + 10;
    } else {
        return;
    }
    // printf("转换后的十进制数是%d\n", num);
    int binary[4];
    for(int i = 0; i < 4; i++) {
        binary[i] = num % 2;
        num /= 2;
    }

    int newnum = 0;
    for(int i = 0; i < 4; i++) {
        newnum = newnum * 2 + binary[i];
    }

    if(newnum >= 0 && newnum <= 9) {
        *c = newnum + '0';
    } else if (newnum > 9 && newnum <= 15) {
        *c = newnum - 10 + 'A';
    }
}

int main() {
    char str1[201], str2[101];
    while (scanf("%s %s", str1, str2) != EOF) {
        // 第一步
        strcat(str1, str2);
        // 第二步
        int len = strlen(str1);
        for(int i = 0; i < len; i = i + 2) {
            if(i >= len) break;
            for(int j = i + 2; j < len; j = j + 2) {
                if(j >= len) break;
                if(str1[j] < str1[i]) {
                    int temp = str1[j];
                    str1[j] = str1[i];
                    str1[i] = temp;
                }
            }
        }
        for(int i = 1; i < len; i = i + 2) {
            if(i >= len) break;
            for(int j = i + 2; j < len; j = j + 2) {
                if(j >= len) break;
                if(str1[j] < str1[i]) {
                    int temp = str1[j];
                    str1[j] = str1[i];
                    str1[i] = temp;
                }
            }
        }
        // 第三步
        for(int i = 0; i < len; i++) {
            stepthree(&str1[i]);
        }
        printf("%s\n", str1);
    }
    return 0;
}

标签:字符,排序,int,str1,len,华为,字符串,机试,HJ30
From: https://blog.csdn.net/bingw0114/article/details/143438867

相关文章

  • 华为OD机试真题-整数编码-2024年OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述实现一种整数编码方法......
  • 【笔记】谈谈阿里云和华为云在云原生微服务领域产品的不同之处
    背景        24年初学习了阿里云云原生微服务的课程和认证,年尾学习了华为云类似课程,想借此温故一下所学知识,结合课程内容总结谈谈对这两朵云的云原生微服务产品不同。        学习是一种愉悦,一种收获,让我们在探索中感受快乐。欢迎关注、点赞和收藏~一、谈......
  • 华为OD机试真题-数组二叉树码-2024年OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述二叉树也可以用数组来......
  • 华为招聘
    华为嵌入式属于软开一、简历投递渠道选择:应聘者可以通过华为的官方招聘网站(如华为校招官网)进行简历投递。此外,BOSS直聘等第三方招聘平台也是可选的简历投递渠道。简历内容:简历应包含个人基本信息、教育背景、工作经历(如有)、专业技能、项目经验等关键信息。对于嵌入式软件开发岗......
  • 【华为OD机试】核酸检测人员安排
    题目描述在系统、网络均正常的情况下组织核酸采样员和志愿者对人群进行核酸检测筛查。每名采样员的效率不同,采样效率为N人/小时。由于外界变化,采样员的效率会以M人/小时为粒度发生变化,M为采样效率浮动粒度,M=N10%,输入保证N10%的结果为整数。采样员效率浮动规则:采样员......
  • 华为OD机试真题---字母组合
    华为OD机试中的“字母组合”题目是一道涉及字符串处理和回溯算法的编程题。以下是对该题目的详细解析:一、题目描述每个数字关联多个字母,关联关系如下:0关联“a”,“b”,“c”1关联“d”,“e”,“f”2关联“g”,“h”,“i”3关联“j”,“k”,“l”4关联“m”,“n......
  • 华为eNSP:配置DHCP Snooping
    1、什么是DHCPSnooping?DHCPSnooping是一种网络安全技术,用于防止未经授权的设备在局域网中提供DHCP服务。DHCP(DynamicHostConfigurationProtocol)是一种用于自动分配IP地址和其他网络配置的协议。DHCPSnooping工作原理是通过监视网络中的DHCP消息,确定哪些设备是合法的DHCP......
  • 华为云开源时序数据库openGemini:使用列存引擎解决时序高基数问题
    摘要:openGemini通过引入新的数据排序与索引方式,开发了全新列存引擎,以解决海量时间线场景对于现有时序数据管理方案带来的问题。本文来源:《华为云DTSE》第五期开源专刊,作者:向宇,华为云数据库高级研发工程师、黄飞腾,博士,openGemini存储引擎架构师在时序数据场景中,大部分的解......
  • 华为大气啊!HarmonyOS NEXT公测发福利~这个可以有
    HarmonyOSNEXT火热公测中,首批100万名公测用户速来领取多重权益!华为视频、华为阅读、音乐、主题、云空间、天际通等应用会员一应俱全;还有爱奇艺、哔哩哔哩、芒果TV、WPS、喜马拉雅、优酷六大应用的会员季卡6选2,这一波不得不说华为大气!......
  • 华为2288HV2服务器安装BCLinux8U6无法显示完整安装界面的问题处理
    本文记录了华为2288HV2服务器安装BCLinux8U6无法显示完整安装界面,在安装过程中配置选择时,右侧安装按钮不可见,导致安装无法继续的问题处理过程。一、问题现象 华为2288HV2服务器安装BCLinux8U6时无法显示完整的安装界面,问题情况如下: 无法显示右侧的开始安装按钮。二、问题......