Bootstrap

华为OD机试 - 表示数字(Python/JS/C/C++ 牛客练习题)

在这里插入图片描述

2025华为OD机试题库(按算法分类):2025华为OD统一考试题库清单(持续收录中)以及考点说明(Python/JS/C/C++)

专栏导读

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

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

一、题目描述

将一个字符串中所有的整数前后加上符号“*”,其他字符保持不变。连续的数字视为一个整数。

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

二、输入描述

输入一个字符串。

三、输出描述

字符中所有出现的数字前后加上符号“*”,其他字符保持不变。

四、测试用例

测试用例1

1、输入

abc123def

2、输出

abc123def

3、说明

中间的“123”是连续数字,所以在其前后各添加一个星号。

测试用例2

1、输入

007bond

2、输出

007bond

3、说明

“007”作为一个连续数字,被星号包围,后面的字母保持原样。

五、解题思路

  1. 读取输入,将字符串存储在变量pInStr中;
  2. 创建一个StringBuilder对象res用于存储结果;
  3. 遍历字符串pInStr的每个字符,判断是否为数字;
    • 如果当前字符是数字,则在res中添加字符’*';
    • 接着,将连续的数字添加到res中,直到遇到非数字字符为止;
    • 最后,在res中添加字符’*';
    • 如果当前字符不是数字,则直接将其添加到res中;
  4. 将res转换为字符串并返回作为结果;

六、Python算法源码

# 定义函数 markNum,用于将字符串中所有整数前后加上“*”
def markNum(s):
    res = []  # 使用列表存储结果字符,后续再拼接为字符串
    i = 0     # 初始化下标 i 为 0
    while i < len(s):  # 循环遍历整个字符串
        # 判断当前字符是否为数字
        if '0' <= s[i] <= '9':
            res.append('*')  # 在数字前添加 *
            # 处理连续的数字字符
            while i < len(s) and '0' <= s[i] <= '9':
                res.append(s[i])  # 添加数字字符到结果列表
                i += 1  # 下标后移
            res.append('*')  # 在数字后添加 *
        else:
            res.append(s[i])  # 非数字字符直接添加到结果列表
            i += 1  # 下标后移
    return ''.join(res)  # 将列表中的字符拼接成字符串返回

# 以下为测试代码,遍历测试用例并打印结果
if __name__ == "__main__":
    test_cases = [
        "abc123def",  # 测试用例1
        "123",        # 测试用例2
        "a1b2",       # 测试用例3
        "a",          # 测试用例4
        "007bond"     # 测试用例5
    ]
    # 对每个测试用例调用 markNum 并输出结果
    for case in test_cases:
        print("输入:", case, "输出:", markNum(case))

七、JavaScript算法源码

// 定义函数 markNum,用于将字符串中所有整数前后加上“*”
function markNum(s) {
    let res = ""; // 初始化结果字符串
    let i = 0;    // 初始化下标 i 为 0
    // 遍历整个字符串
    while (i < s.length) {
        // 判断当前字符是否为数字
        if (s[i] >= '0' && s[i] <= '9') {
            res += "*"; // 在数字前添加 *
            // 处理连续的数字字符
            while (i < s.length && s[i] >= '0' && s[i] <= '9') {
                res += s[i]; // 将数字字符添加到结果中
                i++; // 下标后移
            }
            res += "*"; // 在数字后添加 *
        } else {
            res += s[i]; // 非数字字符直接添加到结果字符串
            i++; // 下标后移
        }
    }
    return res; // 返回处理后的字符串
}

// 以下为测试代码,使用测试用例验证函数正确性
const testCases = [
    "abc123def",  // 测试用例1
    "123",        // 测试用例2
    "a1b2",       // 测试用例3
    "a",          // 测试用例4
    "007bond"     // 测试用例5
];

// 对每个测试用例调用 markNum 并输出结果
testCases.forEach(test => {
    console.log("输入:", test, "输出:", markNum(test));
});

八、C算法源码

#include <stdio.h>
#include <ctype.h>  // 提供 isdigit 函数
#include <string.h>

int main() {
    char input[105];    // 定义输入字符数组,长度稍大于100以保证安全
    // 使用 fgets 读取输入,假设输入以换行结束
    while (fgets(input, sizeof(input), stdin) != NULL) {
        int len = strlen(input);
        // 如果最后一个字符是换行符,则将其替换为字符串结束符
        if (len > 0 && input[len - 1] == '\n') {
            input[len - 1] = '\0';
        }
        char output[256];  // 定义输出字符数组,预留足够空间(最坏情况:所有字符均为数字)
        int j = 0;         // 输出数组下标初始化
        for (int i = 0; input[i] != '\0'; ) {
            // 判断当前字符是否为数字
            if (isdigit(input[i])) {
                output[j++] = '*';  // 数字前添加 *
                // 处理连续数字
                while (input[i] != '\0' && isdigit(input[i])) {
                    output[j++] = input[i++];  // 将数字字符添加到输出
                }
                output[j++] = '*';  // 数字后添加 *
            } else {
                output[j++] = input[i++];  // 非数字字符直接复制到输出
            }
        }
        output[j] = '\0';  // 添加字符串结束符
        printf("%s\n", output);  // 输出结果字符串
    }
    return 0;
}

九、C++算法源码

#include <iostream>
#include <string>
using namespace std;

int main() {
    string input;  
    // 使用 getline 读取每一行输入
    while (getline(cin, input)) {
        string output;  // 用于存储输出结果
        int i = 0;      // 初始化下标 i 为 0
        // 遍历输入字符串
        while (i < input.size()) {
            // 判断当前字符是否为数字
            if (input[i] >= '0' && input[i] <= '9') {
                output.push_back('*');  // 在数字前添加 *
                // 处理连续数字
                while (i < input.size() && input[i] >= '0' && input[i] <= '9') {
                    output.push_back(input[i]);  // 将数字字符添加到输出字符串
                    i++;  // 下标后移
                }
                output.push_back('*');  // 在数字后添加 *
            } else {
                output.push_back(input[i]);  // 非数字字符直接添加到输出
                i++;  // 下标后移
            }
        }
        // 输出处理后的字符串
        cout << output << endl;
    }
    return 0;
}


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

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

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

在这里插入图片描述