当前位置: 面试刷题>> 翻转字符串 (经典算法题500道)


### 题目描述补充 题目:**翻转字符串** 给定一个字符串 `s`,编写一个函数来翻转字符串中的字符顺序,并返回翻转后的新字符串。注意,在翻转过程中,应保留原字符串中的空格和非字母字符不变,只翻转字母字符的顺序。 ### 示例 - 输入: `"Hello World!"` - 输出: `"dlroW olleH!"` ### PHP 示例代码 ```php function reverseString($s) { $length = strlen($s); $result = ''; $left = 0; $right = $length - 1; while ($left < $right) { // 如果左边不是字母且右边是字母,则移动左边指针 if (!ctype_alpha($s[$left]) && ctype_alpha($s[$right])) { $result .= $s[$right]; $right--; } // 如果右边不是字母且左边是字母,则移动右边指针 elseif (!ctype_alpha($s[$right]) && ctype_alpha($s[$left])) { $result .= $s[$left]; $left++; } // 如果两边都是字母,则交换并同时移动指针 elseif (ctype_alpha($s[$left]) && ctype_alpha($s[$right])) { $result .= $s[$right]; $result = strrev(substr($result, 0, -1)) . $s[$left]; // 反转之前已添加的字母部分 $left++; $right--; } // 如果两边都不是字母,直接添加到结果中并移动指针 else { $result .= $s[$right]; $right--; } } // 处理中间剩余的字符(如果长度为奇数且中间的字符非字母) if ($left == $right) { $result .= $s[$left]; } // 如果原字符串开始有非字母字符,则需要在结果前面也加上这些字符 return substr_replace($s, $result, 0, $length); } // 示例 echo reverseString("Hello World!"); // 输出: "dlroW olleH!" ``` 注意:上述 PHP 代码在处理边界和特殊情况(如中间位置的字符为非字母)时可能稍显复杂,并且可能不是最高效的解决方案。 ### Python 示例代码 ```python def reverseString(s): # 使用列表和列表推导式来翻转字母字符,保留其他字符 return ''.join([s[i] if not s[i].isalpha() else s[-(j+1)] for i, j in enumerate(reversed(range(len(s)))) if s[-(j+1)].isalpha()]) # 示例 print(reverseString("Hello World!")) # 输出: "dlroW olleH!" ``` 注意:Python 示例虽然简洁,但可能在处理包含大量非字母字符的字符串时效率不是最高,因为它遍历了字符串两次(一次是 `reversed(range(len(s)))`,另一次是列表推导式中的 `enumerate`)。 ### JavaScript 示例代码 ```javascript function reverseString(s) { let reversed = ''; let left = 0; let right = s.length - 1; while (left < right) { // 只处理字母字符 if (!/[a-zA-Z]/.test(s[left]) && /[a-zA-Z]/.test(s[right])) { reversed = s[right] + reversed; right--; } else if (/[a-zA-Z]/.test(s[left]) && !/[a-zA-Z]/.test(s[right])) { reversed = s[left] + reversed; left++; } else if (/[a-zA-Z]/.test(s[left]) && /[a-zA-Z]/.test(s[right])) { let temp = s[right]; reversed = s[left] + reversed; s = s.substr(0, left) + temp + s.substr(right + 1); left++; right--; } else { right--; } } // 处理中间位置的字符(如果字符串长度为奇数) if (left == right) { reversed = s[left] + reversed; } // 拼接剩余未处理的字符串部分 return s.substr(0, left) + reversed + s.substr(right + 1); } // 示例 console.log(reverseString("Hello World!")); // 输出: "dlroW olleH!" ``` JavaScript 示例在处理过程中稍微复杂了一些,特别是在处理字符串拼接和索引调整上。不过,它确保了只翻转字母字符,同时保留了其他所有字符的原始位置和顺序。 ### 码小课 码小课网站中有更多关于字符串处理、算法设计以及编程语言特性的相关内容分享,欢迎大家学习交流!
推荐面试题