反转字符串中的单词 III

本文介绍了一种字符串处理算法,该算法能够反转字符串中每个单词的字符顺序,同时保持空格和单词的初始顺序不变。通过示例展示了如何将Let'stakeLeetCodecontest转换为s'teLekatedoCteeLtsetnoc,并提供了详细的实现步骤。

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

示例 1:

输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc" 

注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

分析:
        // 每个单词分割出来,倒过来放,再全部倒过来,如下所示
        // 1. ab cd e fgh
        // 2. fgh e cd ab
        // 3. ba dc e hgf
        // 得到答案

        // 因为没有多余的空格,所以不需要考虑特殊情况

class Solution {
public:
    string reverseWords(string s) {
        // 每个单词分割出来,倒过来放,再全部倒过来,如下所示
        // 1. ab cd e fgh
        // 2. fgh e cd ab
        // 3. ba dc e hgf
        // 得到答案
        string result="";
        int count=0;
        for(int i=s.length()-1; i>=0; i--){
            // 已经得到了一个单词
            if(s[i] == ' '){
                string curr = s.substr(i+1,count);
                result += curr;
                result += " ";
                count = 0;
                continue;
            }
            count ++;
            // 最后一个
            if(i==0)
                result += s.substr(0,count);
        }
        reverse(result.begin(),result.end());
        return result;
    }
};

 

<think>我们已经在之前的对话中提供了一个使用高阶函数反转字符串单词的示例。但是,用户再次询问,可能是希望得到更详细的解释或者不同的方法。因此,我们将提供两种方法:一种是使用高阶函数(如前所述),另一种是使用循环和数组操作(以满足不同需求)。同时,我们将确保代码适用于ArkTS(基于TypeScript)。 ### 方法一:使用高阶函数(函数式风格) 这种方法使用`split`、`map`、`reverse`和`join`等高阶函数,代码简洁。 ```typescript function reverseWords(sentence: string): string { // 按空格分割字符串单词数组 return sentence.split(' ') // 对每个单词:分割为字符数组 -> 反转 -> 再合并 .map(word => word.split('').reverse().join('')) .join(' '); // 用空格连接所有单词 } // 示例 const input = "Hello World from ArkTS"; console.log(reverseWords(input)); // 输出: "olleH dlroW morf STRkA" ``` ### 方法二:使用循环(过程式风格) 如果用户希望避免使用高阶函数,可以使用循环来实现。 ```typescript function reverseWords(sentence: string): string { // 将整个字符串分割成单词 const words = sentence.split(' '); let result = ''; for (let i = 0; i < words.length; i++) { // 反转当前单词 let reversedWord = ''; for (let j = words[i].length - 1; j >= 0; j--) { reversedWord += words[i][j]; } // 将反转后的单词添加到结果中,并在单词之间添加空格(最后一个单词不加) result += reversedWord; if (i < words.length - 1) { result += ' '; } } return result; } // 示例 const input = "Hello World from ArkTS"; console.log(reverseWords(input)); // 输出: "olleH dlroW morf STRkA" ``` ### 说明 - 方法一更简洁,利用了数组的高阶函数,是函数式编程的典型例子。 - 方法二使用双重循环,外层遍历单词,内层反转每个单词。这种方法可能更易于初学者理解,但在字符串拼接时效率较低(因为每次拼接都会创建新的字符串)。在需要高性能的场景下,可以使用数组来构建每个反转单词,然后使用`join`方法。 ### 性能优化 对于方法二,我们可以通过使用数组来构建反转单词,避免字符串拼接的性能问题: ```typescript function reverseWords(sentence: string): string { const words = sentence.split(' '); const reversedWords: string[] = []; for (let i = 0; i < words.length; i++) { const word = words[i]; const reversedChars: string[] = []; for (let j = word.length - 1; j >= 0; j--) { reversedChars.push(word[j]); } reversedWords.push(reversedChars.join('')); } return reversedWords.join(' '); } ``` ### 注意事项 - 上述方法假设单词之间由单个空格分隔。如果分隔符是多个空格或其他字符,需要调整`split`的参数(例如使用正则表达式`split(/\s+/)`)以保留原始分隔符。但反转单词时,我们只反转单词本身,不改变分隔符。 - 如果字符串包含标点符号,这些方法会将标点视为单词的一部分一起反转。如果需求是只反转字母而保留标点位置,则需要更复杂的处理(如使用正则表达式匹配单词边界)。 ### 相关问题 1. 如何在 ArkTS 中处理包含多种分隔符的字符串? 2. 如何优化字符串操作以提高性能? 3. 在 ArkTS 中,如何反转整个字符串(而不是每个单词)?</think>在 ArkTS 中实现字符串单词反转,可以通过高阶函数链式操作高效完成。以下是两种实现方法: ### 方法一:函数式高阶函数(推荐) ```typescript function reverseWords(sentence: string): string { return sentence .split(' ') // 1. 按空格分割成单词数组 .map(word => // 2. 对每个单词进行反转 word.split('') // 2.1 拆分为字符数组 .reverse() // 2.2 反转字符顺序 .join('') // 2.3 合并为字符串 ) .join(' '); // 3. 重新拼接为完整字符串 } // 使用示例 const input = "ArkTS is powerful"; console.log(reverseWords(input)); // 输出: "STRkA si lufrewop" ``` ### 方法二:正则表达式处理(支持多空格) ```typescript function reverseWords(sentence: string): string { return sentence .split(/\s+/) // 使用正则处理连续空格 .map(word => [...word].reverse().join('')) .join(' '); } // 使用示例 console.log(reverseWords("Hello World")); // 输出: "olleH dlroW" ``` ### 关键步骤解析: 1. **分割单词**:`split(' ')` 或 `split(/\s+/)` 将字符串转为单词数组 2. **单词反转**:`map()` 高阶函数处理每个单词 - `split('')` → 将单词转为字符数组 - `reverse()` → 反转字符顺序 - `join('')` → 重组为反转后的单词 3. **重组句子**:`join(' ')` 将处理后的单词数组拼接为字符串 ### 注意事项: - 标点处理:上述方法会将标点视为单词的一部分反转(如 `"world!"` → `"!dlrow"`) - 性能优化:对于超长字符串,建议使用 `StringBuilder` 替代链式操作 - 大小写敏感:反转过程保留原始大小写(如 `"ArkTS"` → `"STRkA"`) > 此实现利用了 ArkTS/TypeScript 的函数式特性,通过高阶函数 `map()` 配合字符串操作方法,简洁高效地完成单词反转任务[^1]。 --- ### 相关问题 1. 如何在 ArkTS 中处理字符串反转时的标点符号位置? 2. ArkTS 中有哪些高效的字符串构建方法(如 StringBuilder)? 3. 如何实现不改变单词顺序的整句反转(如 "Hello World" → "World Hello")? 4. 在 ArkTS 中如何优化超长字符串的处理性能?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值