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


题目描述补充

题目:翻转字符串

给定一个字符串 s,编写一个函数来翻转字符串中的字符顺序,并返回翻转后的新字符串。注意,在翻转过程中,应保留原字符串中的空格和非字母字符不变,只翻转字母字符的顺序。

示例

  • 输入: "Hello World!"
  • 输出: "dlroW olleH!"

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 示例代码

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 示例代码

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 示例在处理过程中稍微复杂了一些,特别是在处理字符串拼接和索引调整上。不过,它确保了只翻转字母字符,同时保留了其他所有字符的原始位置和顺序。

码小课

码小课网站中有更多关于字符串处理、算法设计以及编程语言特性的相关内容分享,欢迎大家学习交流!

推荐面试题