您现在的位置是:首页 >技术教程 >华为OD机试 - 简单密码(Python/JS/C/C++ 牛客练习题 HJ21)网站首页技术教程

华为OD机试 - 简单密码(Python/JS/C/C++ 牛客练习题 HJ21)

哪 吒 2025-04-01 00:01:01
简介华为OD机试 - 简单密码(Python/JS/C/C++ 牛客练习题 HJ21)

在这里插入图片描述

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

专栏导读

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

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

一、题目描述

现在有一种密码变换算法。
九键手机键盘上的数字与字母的对应: 1--1, abc--2, def--3, ghi--4, jkl--5, mno--6, pqrs--7, tuv--8 wxyz--9, 0--0,把密码中出现的小写字母都变成九键键盘对应的数字,如:a 变成 2,x 变成 9。

而密码中出现的大写字母则变成小写之后往后移一位,如:X ,先变成小写,再往后移一位,变成了 y ,例外:Z 往后移是 a 。
数字和其它的符号都不做变换。

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

二、输入描述

输入一组密码,长度不超过100个字符。

三、输出描述

输出密码变换后的字符串。

四、测试用例

四、测试用例

测试用例1

1、输入

AaBbCcDdEeFfGg

2、输出

b2c2d2e3f3g3h4

测试用例2

1、输入

CSDNnezbc2023

2、输出

dteo639222023

五、解题思路

  1. 读取输入的密码字符串;
  2. 创建一个字符数组 a,用于存储九键手机键盘上数字与字母的对应关系;
  3. 创建一个 StringBuilder 对象 sb,用于存储转换后的密码字符串;
  4. 遍历输入的密码字符串,对每个字符进行如下操作:
    • 如果字符是大写字母(A 到 Z),将其转换为小写字母,并往后移一位;如果移动后的字符超出小写字母范围,则循环回到 a;
    • 如果字符是小写字母(a 到 z),根据九键手机键盘上的对应关系将其转换为相应的数字;
    • 其他情况下,字符保持不变;
  5. 将转换后的字符添加到 sb 中;
  6. 输出 sb 中存储的转换后的密码字符串;

六、Python算法源码

def transform_password(s):
    # 用于存储九键手机键盘上数字与字母的对应关系
    a = ['2', '2', '2', '3', '3', '3', '4', '4', '4', '5', '5', '5',
         '6', '6', '6', '7', '7', '7', '7', '8', '8', '8', '9', '9', '9', '9']
    
    result = []
    for c in s:
        # 如果是大写字母
        if 'A' <= c <= 'Z':
            c = chr(ord(c) + 32)  # 转为小写
            # 如果是 'z' 后移是 'a'
            if c == 'z' + 1:
                c = 'a'
            else:
                c = chr(ord(c) + 1)
        # 如果是小写字母
        elif 'a' <= c <= 'z':
            c = a[ord(c) - ord('a')]
        result.append(c)
    
    return ''.join(result)

# 测试
print(transform_password("CSDNnezbc2023"))

七、JavaScript算法源码

function transformPassword(s) {
    // 用于存储九键手机键盘上数字与字母的对应关系
    let a = ['2', '2', '2', '3', '3', '3', '4', '4', '4', '5', '5', '5',
             '6', '6', '6', '7', '7', '7', '7', '8', '8', '8', '9', '9', '9', '9'];
    let result = '';
    
    for (let i = 0; i < s.length; i++) {
        let c = s[i];
        // 如果是大写字母
        if (c >= 'A' && c <= 'Z') {
            c = String.fromCharCode(c.charCodeAt(0) + 32); // 转为小写
            // 如果是 'z' 后移是 'a'
            if (c === String.fromCharCode('z'.charCodeAt(0) + 1)) {
                c = 'a';
            } else {
                c = String.fromCharCode(c.charCodeAt(0) + 1);
            }
        }
        // 如果是小写字母
        else if (c >= 'a' && c <= 'z') {
            c = a[c.charCodeAt(0) - 'a'.charCodeAt(0)];
        }
        result += c;
    }

    return result;
}

// 测试
console.log(transformPassword("CSDNnezbc2023"));

八、C算法源码

#include <stdio.h>
#include <string.h>

void transformPassword(char *s) {
    char a[] = {'2', '2', '2', '3', '3', '3', '4', '4', '4', '5', '5', '5',
                '6', '6', '6', '7', '7', '7', '7', '8', '8', '8', '9', '9', '9', '9'};
    
    for (int i = 0; s[i] != ''; i++) {
        char c = s[i];
        // 如果是大写字母
        if (c >= 'A' && c <= 'Z') {
            c = c + 32; // 转为小写
            // 如果是 'z' 后移是 'a'
            if (c == 'z' + 1) {
                c = 'a';
            } else {
                c = c + 1;
            }
        }
        // 如果是小写字母
        else if (c >= 'a' && c <= 'z') {
            c = a[c - 'a'];
        }
        printf("%c", c);
    }
    printf("
");
}

int main() {
    char s[] = "CSDNnezbc2023";
    transformPassword(s);
    return 0;
}

九、C++算法源码

#include <iostream>
#include <string>

void transformPassword(std::string s) {
    char a[] = {'2', '2', '2', '3', '3', '3', '4', '4', '4', '5', '5', '5',
                '6', '6', '6', '7', '7', '7', '7', '8', '8', '8', '9', '9', '9', '9'};
    
    for (char c : s) {
        // 如果是大写字母
        if (c >= 'A' && c <= 'Z') {
            c = c + 32; // 转为小写
            // 如果是 'z' 后移是 'a'
            if (c == 'z' + 1) {
                c = 'a';
            } else {
                c = c + 1;
            }
        }
        // 如果是小写字母
        else if (c >= 'a' && c <= 'z') {
            c = a[c - 'a'];
        }
        std::cout << c;
    }
    std::cout << std::endl;
}

int main() {
    std::string s = "CSDNnezbc2023";
    transformPassword(s);
    return 0;
}


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

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

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

在这里插入图片描述

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。