• [LeetCode] Reverse Words in a String


    https://leetcode.com/problems/reverse-words-in-a-string/?tab=Description

    做法1

    • 先整体反转
    • 再定位到每一个word,做局部反转,同时in-place挪走空格
    • 最后pop掉尾巴的空格

    Time complexity: O(n)
    Space complexity: O(1)

    class Solution {
    public:
        void reverseWords(string &s) {
            for (int i = 0, j = s.size() - 1; i < j; i++, j--) {
                swap(s[i], s[j]);
            }
    
            int next_pos = 0, start = 0, end = 0;
            while (start < s.size()) {
                while (start < s.size() && s[start] == ' ') start++;
                end = start;
                while (end < s.size() && s[end] != ' ') end++;
                // reverse a word in [start, end - 1]
                for (int i = start, j = end - 1; i < j; i++, j--) {
                    swap(s[i], s[j]);
                }
                // shift
                for (int i = start; i < end; ++i) {
                    swap(s[i], s[next_pos++]);
                }
                next_pos++;
                start = end;
            }
            for (int i = s.size() - 1; i >= 0 && s[i] == ' '; --i) {
                s.pop_back();
            }
        }
    };
    

    做法2:

    思路和做法1一样,只是为了消空格方便,用string流。

    Time complexity: O(n)
    Space complexity: O(n)

    class Solution {
    public:
        void reverseWords(string &s) {
            reverse(s.begin(), s.end());
            
            stringstream ss(s);
            string str, ret;
            while (ss >> str) {
                reverse(str.begin(), str.end());
                for (char c : str) {
                    ret.push_back(c);
                }
                ret.push_back(' ');
            }
            if (!ret.empty()) ret.pop_back();
            s = ret;
        }
    };
    

    C语言:

    void swap(char *p, char *q)
    {
        char tmp = *p;
        *p = *q;
        *q = tmp;
    }
    
    void reverseWords(char *s) {
        int len = strlen(s);
        
        for (int i = 0, j = len - 1; i < j; i++, j--) {
            swap(&s[i], &s[j]);
        }
    
        int next_pos = 0, start = 0, end = 0;
        while (start < len) {
            while (start < len && s[start] == ' ') start++;
            end = start;
            while (end < len && s[end] != ' ') end++;
            // reverse a word in [start, end - 1]
            for (int i = start, j = end - 1; i < j; i++, j--) {
                swap(&s[i], &s[j]);
            }
            // shift
            for (int i = start; i < end; ++i) {
                swap(&s[i], &s[next_pos++]);
            }
            next_pos++;
            start = end;
        }
        
        if (next_pos-2 >= 0 && s[next_pos-2] == ' ')
            s[next_pos-2] = '';
        else
            s[next_pos-1] = '';
    }
    
  • 相关阅读:
    3组Alpha冲刺5/6
    3组Beta冲刺4/5
    3组Alpha冲刺6/6
    3组Beta冲刺2/5
    3组Beta冲刺3/5
    delegate Demo (一个关于System.Timers.Timer的Demo)
    System.Web.HttpException 与 HTTP Error 404.13 Not Found问题解决说明
    常用SQL关于表的操作
    设计模式学习笔记:单例模式
    JS 实践杂记
  • 原文地址:https://www.cnblogs.com/ilovezyg/p/6441953.html
Copyright © 2020-2023  润新知