Efficiently reverse the order of the words (not characters) in an array of characters

前端 未结 21 1799
[愿得一人]
[愿得一人] 2020-11-28 04:40

Given an array of characters which forms a sentence of words, give an efficient algorithm to reverse the order of the words (not characters) in it.

Example input and

相关标签:
21条回答
  • 2020-11-28 04:49

    A C++ solution:

    #include <string>
    #include <iostream>
    using namespace std;
    
    string revwords(string in) {
        string rev;
        int wordlen = 0;
        for (int i = in.length(); i >= 0; --i) {
            if (i == 0 || iswspace(in[i-1])) {
                if (wordlen) {
                    for (int j = i; wordlen--; )
                        rev.push_back(in[j++]);
                    wordlen = 0;
                }
                if (i > 0)
                    rev.push_back(in[i-1]);
            }
            else
                ++wordlen;
        }
        return rev;
    }
    
    int main() {
        cout << revwords("this is a sentence") << "." << endl;
        cout << revwords("  a sentence   with extra    spaces   ") << "." << endl;
        return 0;
    }
    
    0 讨论(0)
  • 2020-11-28 04:49

    A Ruby solution.

    # Reverse all words in string
    def reverse_words(string)
      return string if string == ''
    
      reverse(string, 0, string.size - 1)
    
      bounds = next_word_bounds(string, 0)
    
      while bounds.all? { |b| b < string.size }
        reverse(string, bounds[:from], bounds[:to])
        bounds = next_word_bounds(string, bounds[:to] + 1)
      end
    
      string
    end
    
    # Reverse a single word between indices "from" and "to" in "string"
    def reverse(s, from, to)
        half = (from - to) / 2 + 1
    
        half.times do |i|
            s[from], s[to] = s[to], s[from]
            from, to = from.next, to.next
        end
    
        s
    end
    
    # Find the boundaries of the next word starting at index "from"
    def next_word_bounds(s, from)
      from = s.index(/\S/, from) || s.size
      to = s.index(/\s/, from + 1) || s.size
    
      return { from: from, to: to - 1 }
    end
    
    0 讨论(0)
  • 2020-11-28 04:50

    In pseudo code:

    reverse input string
    reverse each word (you will need to find word boundaries)
    
    0 讨论(0)
  • 2020-11-28 04:50

    This problem can be solved with O(n) in time and O(1) in space. The sample code looks as mentioned below:

        public static string reverseWords(String s)
        {
    
            char[] stringChar = s.ToCharArray();
            int length = stringChar.Length, tempIndex = 0;
    
            Swap(stringChar, 0, length - 1);
    
            for (int i = 0; i < length; i++)
            {
                if (i == length-1)
                {
                    Swap(stringChar, tempIndex, i);
                    tempIndex = i + 1;
                }
                else if (stringChar[i] == ' ')
                {
                    Swap(stringChar, tempIndex, i-1);
                    tempIndex = i + 1;
                }
            }
    
            return new String(stringChar);
        }
    
        private static void Swap(char[] p, int startIndex, int endIndex)
        {
            while (startIndex < endIndex)
            {
                p[startIndex] ^= p[endIndex];
                p[endIndex] ^= p[startIndex];
                p[startIndex] ^= p[endIndex];
                startIndex++;
                endIndex--;
            }
        }
    
    0 讨论(0)
  • 2020-11-28 04:53

    Push each word onto a stack. Pop all the words off the stack.

    0 讨论(0)
  • 2020-11-28 04:54

    The algorithm to solve this problem is based on two steps process, first step will reverse the individual words of string,then in second step, reverse whole string. Implementation of algorithm will take O(n) time and O(1) space complexity.

          #include <stdio.h>
          #include <string.h>
    
          void reverseStr(char* s, int start, int end);
    
          int main()
          {
                  char s[] = "This is test string";
    
                  int start = 0;
                  int end = 0;
                  int i = 0;
    
                  while (1) {
    
                  if (s[i] == ' ' || s[i] == '\0')
                  {
                        reverseStr(s, start, end-1);
                        start = i + 1;
                        end = start;
                  }
                  else{
                        end++;
                  }
    
                  if(s[i] == '\0'){
                       break;
                  }
                  i++;
          }
    
          reverseStr(s, 0, strlen(s)-1);
          printf("\n\noutput= %s\n\n", s);
    
          return 0;
      }
    
      void reverseStr(char* s, int start, int end)
      {
         char temp;
         int j = end;
         int i = start;
    
         for (i = start; i < j ; i++, j--) {
              temp = s[i];
              s[i] = s[j];
              s[j] = temp;
         }
     }
    
    0 讨论(0)
提交回复
热议问题