zoukankan      html  css  js  c++  java
  • 反转字符串中的单词

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

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

    示例1:

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

    解法一:遍历+reversed

    思路:首先将字符串以空格来分割成不同的字符串,然后通过遍历将每个字符串然后将其反转。

    func reverseWords(_ s: String) -> String {
        guard s.count > 0 else { return ""}
        let words = s.split(separator: " ")
        var result = ""
        words.forEach {
            result += String($0.reversed())
            result += " "
        }
        result.removeLast()
        return result
    }
    
    let words = reverseWords("Let's take LeetCode contest")
    print(words)

    下面我们在playground下面运行的结果,对应每行的效果:

    解法二:双指针+异或交换法

    双指针法在运行的过程中会有一个头指针固定,尾指针不断向前移动,遇到空格即为头指针和尾指针之间为一个单词,然后对这个单词进行反转即可。

    而使用的交换算法是反转字符串中最快速的异或交换法,不过实际上还是一个双指针的解法。

    public:
    // 反转字符串
    void reverseString(int front, int tail, string& str) {
        while (front < tail) {
            str[front] ^= str[tail];
            str[tail] ^= str[front];
            str[front++] ^= str[tail--];
        }
    }
    // 确定单词边界
    string reverseWords(string s) {
        int front = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s[i] == ' ') {
                reverseString(front, i - 1, s);
                front = i + 1;
            }
        }
        reverseString(front, s.length() - 1, s);
        return s;
    }

    上面是反转字符串的进阶版本,本人觉得第二种方法的异或思想很不错值得大家参考,希望对大家有帮助,谢谢!!!

     

  • 相关阅读:
    《Java技术》第四次作业
    Java第三次作业——面向对象基础(封装)
    《Java技术》第二次作业
    #《Java技术》第一次作业
    Java第十次作业
    Java第九次作业
    Java第八次作业
    Java第七次作业
    Java第6次作业
    Java第五次作业
  • 原文地址:https://www.cnblogs.com/guohai-stronger/p/11747936.html
Copyright © 2011-2022 走看看