当前位置: 面试刷题>> 翻转字符串 (经典算法题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 示例在处理过程中稍微复杂了一些,特别是在处理字符串拼接和索引调整上。不过,它确保了只翻转字母字符,同时保留了其他所有字符的原始位置和顺序。
### 码小课
码小课网站中有更多关于字符串处理、算法设计以及编程语言特性的相关内容分享,欢迎大家学习交流!