专栏导读
本专栏收录于《华为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
五、解题思路
- 程序通过一个 while 循环和 Scanner 对象来持续读取用户输入的多行句子。
- 对每一行读入的句子,使用字符串的 split(" ") 方法,以空格为分隔符将其切割成一个一个的单词。这些单词被存储在一个字符串数组 String[] 中。
- 通过一个 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算法的适用场景,发现新题目,随时更新。