华为OD机试 - 句子逆序 - 字符串、逆序遍历(Python/JS/C/C++ 2025 B卷 100分)

在这里插入图片描述

2025B卷华为OD机试统一考试题库清单(持续收录中)以及考点说明(Python/JS/C/C++)

专栏导读

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

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

一、题目描述

将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”。所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符。

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

注意本题有多组输入。

二、输入描述

输入一个英文语句,每个单词用空格隔开。保证输入只包含空格和字母。

三、输出描述

得到逆序的句子

四、测试用例

测试用例1:

1、输入

I am a boy

2、输出

boy a am I

测试用例2:

1、输入

nowcoder

2、输出

nowcoder

五、解题思路

  1. 程序通过一个 while 循环和 Scanner 对象来持续读取用户输入的多行句子。
  2. 对每一行读入的句子,使用字符串的 split(" ") 方法,以空格为分隔符将其切割成一个一个的单词。这些单词被存储在一个字符串数组 String[] 中。
  3. 通过一个 for 循环,从后往前遍历这个单词数组(即从数组的最后一个元素到第一个元素)。在循环中,依次打印出每个单词,并在单词之间加上空格。

六、Python算法源码

# 导入 sys 模块以处理标准输入
import sys

# 定义一个函数来解决问题,这样可以使代码结构更清晰
def solve():
  # 使用 for 循环逐行读取标准输入(可以处理多组测试用例)
  for line in sys.stdin:
    # 移除行首和行尾的空白字符(例如换行符 \n)
    stripped_line = line.strip()
    # 如果处理后的行为空,则跳过此次循环,处理下一行
    if not stripped_line:
      continue
    # 使用 split(' ') 方法将字符串按空格分割成一个单词列表
    words = stripped_line.split(' ')
    # 使用 Python 的列表切片功能 [::-1] 来快速反转列表中的元素顺序
    reversed_words = words[::-1]
    # 使用 ' '.join() 方法将反转后的单词列表用单个空格连接成一个新的字符串
    reversed_sentence = ' '.join(reversed_words)
    # 打印最终得到的逆序句子
    print(reversed_sentence)

# 当脚本直接执行时,调用 solve 函数
if __name__ == "__main__":
    solve()

七、JavaScript算法源码

// 引入 Node.js 内置的 readline 模块,用于逐行读取输入流
const readline = require('readline');

// 创建 readline 的接口实例
const rl = readline.createInterface({
  input: process.stdin,   // 设置输入流为标准输入
  output: process.stdout, // 设置输出流为标准输出
  terminal: false         // 告知接口这不是一个终端,以便正确处理重定向或管道的输入
});

// 监听 'line' 事件,每当输入流接收到一行数据(以 \n 结尾)时,此回调函数就会被执行
rl.on('line', function(line) {
  // 移除输入字符串两端的任何空白字符
  const trimmedLine = line.trim();
  // 如果处理后的行为空字符串,则直接返回,不进行任何操作
  if (trimmedLine === '') {
      return;
  }
  // 使用 split(' ') 方法将字符串按单个空格分割成一个单词数组
  const words = trimmedLine.split(' ');
  // 使用数组的 reverse() 方法原地反转数组中元素的顺序
  const reversed_words = words.reverse();
  // 使用数组的 join(' ') 方法将数组中的所有元素用单个空格连接成一个字符串
  const reversed_sentence = reversed_words.join(' ');
  // 通过 console.log 打印最终结果到标准输出,并自动添加换行符
  console.log(reversed_sentence);
});

八、C算法源码

#include <stdio.h>    // 引入标准输入输出库 (printf, fgets)
#include <string.h>   // 引入字符串处理库 (strtok, strlen, strcspn)
#include <stdlib.h>   // 引入标准库

#define MAX_LEN 1001   // 定义输入行的最大长度(根据题目约束 1000 + 1 个结束符)
#define MAX_WORDS 1001 // 定义可以处理的最大单词数

int main() {
    char line[MAX_LEN]; // 声明一个字符数组(字符串)来存储输入的行

    // 使用 fgets 循环读取输入的每一行,直到文件结束 (EOF)
    // fgets 比 gets 安全,因为它会检查缓冲区大小,防止溢出
    while (fgets(line, sizeof(line), stdin) != NULL) {
        
        // 移除行尾可能存在的换行符 '\n',将其替换为字符串结束符 '\0'
        line[strcspn(line, "\n")] = 0;

        // 如果处理后的行是空的,则跳过本次循环
        if (strlen(line) == 0) {
            continue;
        }

        // 声明一个指针数组,用于存储每个单词在 line 字符串中的起始地址
        char* words[MAX_WORDS]; 
        int word_count = 0;     // 初始化单词计数器

        // 使用 strtok 函数来分割字符串。它会用 '\0' 替换找到的第一个分隔符 " "
        char* token = strtok(line, " "); 

        // 循环获取所有单词
        while (token != NULL) {
            words[word_count] = token; // 将当前单词的指针存入数组
            word_count++;              // 单词计数加一
            // 再次调用 strtok 并传入 NULL,表示在原始字符串上继续查找下一个单词
            token = strtok(NULL, " ");   
        }

        // 从后向前遍历单词指针数组
        for (int i = word_count - 1; i >= 0; i--) {
            printf("%s", words[i]); // 打印当前指针指向的单词
            // 如果不是第一个被打印的单词(即原数组中索引 > 0 的元素),则在后面打印一个空格
            if (i > 0) {
                printf(" ");
            }
        }
        printf("\n"); // 在每行输出结束后打印一个换行符
    }

    return 0; // 程序正常结束
}

九、C++算法源码

#include <iostream>   // 引入输入输出流库 (cin, cout)
#include <string>     // 引入字符串处理库 (std::string)
#include <vector>     // 引入动态数组库 (std::vector)
#include <sstream>    // 引入字符串流库 (std::stringstream),用于方便地分割字符串
#include <algorithm>  // 引入算法库,其中包含 std::reverse 函数

int main() {
    // 设置不与C风格的IO同步,可以提高 C++ 流的性能
    std::ios_base::sync_with_stdio(false);
    // 解除 cin 和 cout 的绑定,避免不必要的刷新,进一步提高性能
    std::cin.tie(NULL);

    std::string line; // 声明一个字符串变量 line 来存储每一行的输入

    // 使用 while 循环和 std::getline 从标准输入 std::cin 中读取一整行到 line
    while (std::getline(std::cin, line)) {
        if (line.empty()) { // 检查读取的行是否为空
            continue;       // 如果为空,则跳过,处理下一行
        }
        
        std::stringstream ss(line); // 用当前行 line 初始化一个字符串流 ss
        std::string word;           // 声明一个字符串变量 word 来存储每个被提取的单词
        std::vector<std::string> words; // 声明一个字符串向量(动态数组) words 来存储所有单词

        // 从字符串流 ss 中提取单词(以空白字符为分隔符),直到流结束
        while (ss >> word) {
            words.push_back(word); // 将提取出的单词添加到向量 words 的末尾
        }

        // 使用 <algorithm> 中的 std::reverse 函数反转向量 words 中元素的顺序
        std::reverse(words.begin(), words.end());

        // 遍历反转后的向量
        for (size_t i = 0; i < words.size(); ++i) {
            std::cout << words[i]; // 输出当前单词
            // 如果当前单词不是最后一个,就在其后输出一个空格
            if (i < words.size() - 1) {
                std::cout << " ";
            }
        }
        std::cout << std::endl; // 在每行输出结束后打印一个换行符
    }

    return 0; // 程序正常结束,返回 0
}


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

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

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哪 吒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值