Reverse the ordering of words in a string

后端 未结 30 3802
青春惊慌失措
青春惊慌失措 2020-11-22 10:23

I have this string s1 = \"My name is X Y Z\" and I want to reverse the order of the words so that s1 = \"Z Y X is name My\".

I can do it u

相关标签:
30条回答
  • 2020-11-22 10:54

    What language? If PHP, you can explode on space, then pass the result to array_reverse.

    If its not PHP, you'll have to do something slightly more complex like:

    words = aString.split(" ");
    for (i = 0; i < words.length; i++) {
        words[i] = words[words.length-i];
    }
    
    0 讨论(0)
  • 2020-11-22 10:55
    In Python...
    
    ip = "My name is X Y Z"
    words = ip.split()
    words.reverse()
    print ' '.join(words)
    

    Anyway cookamunga provided good inline solution using python!

    0 讨论(0)
  • 2020-11-22 10:57

    You cannot do the reversal without at least some extra data structure. I think the smallest structure would be a single character as a buffer while you swap letters. It can still be considered "in place", but it's not completely "extra data structure free".

    Below is code implementing what Bill the Lizard describes:

    string words = "this is a test";
    
    // Reverse the entire string
    for(int i = 0; i < strlen(words) / 2; ++i) {
      char temp = words[i];
      words[i] = words[strlen(words) - i];
      words[strlen(words) - i] = temp;
    }
    
    // Reverse each word
    for(int i = 0; i < strlen(words); ++i) {
      int wordstart = -1;
      int wordend = -1;
      if(words[i] != ' ') {
        wordstart = i;
        for(int j = wordstart; j < strlen(words); ++j) {
          if(words[j] == ' ') {
            wordend = j - 1;
            break;
          }
        }
        if(wordend == -1)
          wordend = strlen(words);
        for(int j = wordstart ; j <= (wordend + wordstart) / 2 ; ++j) {
          char temp = words[j];
          words[j] = words[wordend - (j - wordstart)];
          words[wordend - (j - wordstart)] = temp;
        }
        i = wordend;
      }
    }
    
    0 讨论(0)
  • 2020-11-22 11:00

    Better version
    Check my blog http://bamaracoulibaly.blogspot.co.uk/2012/04/19-reverse-order-of-words-in-text.html

    public string reverseTheWords(string description)
    {
        if(!(string.IsNullOrEmpty(description)) && (description.IndexOf(" ") > 1))
        {
            string[] words= description.Split(' ');
            Array.Reverse(words);
            foreach (string word in words)
            {
                string phrase = string.Join(" ", words);
                Console.WriteLine(phrase);
            }
            return phrase;
        }
        return description;
    }
    
    0 讨论(0)
  • 2020-11-22 11:01

    This is not perfect but it works for me right now. I don't know if it has O(n) running time btw (still studying it ^^) but it uses one additional array to fulfill the task.

    It is probably not the best answer to your problem because i use a dest string to save the reversed version instead of replacing each words in the source string. The problem is that i use a local stack variable named buf to copy all the words in and i can not copy but into the source string as this would lead to a crash if the source string is const char * type.

    But it was my first attempt to write s.th. like this :) Ok enough blablub. here is code:

    #include <iostream>
    using namespace std;
    
    void reverse(char *des, char * const s);
    int main (int argc, const char * argv[])
    {    
        char* s = (char*)"reservered. rights All Saints. The 2011 (c) Copyright 11/10/11 on Pfundstein Markus by Created";
        char *x = (char*)"Dogfish! White-spotted Shark, Bullhead";
    
        printf("Before: |%s|\n", x);
        printf("Before: |%s|\n", s);
    
        char *d = (char*)malloc((strlen(s)+1)*sizeof(char));  
        char *i = (char*)malloc((strlen(x)+1)*sizeof(char));
    
        reverse(d,s);
        reverse(i,x);
    
        printf("After: |%s|\n", i);
        printf("After: |%s|\n", d);
    
        free (i);
        free (d);
    
        return 0;
    }
    
    void reverse(char *dest, char *const s) {
        // create a temporary pointer
        if (strlen(s)==0) return;
        unsigned long offset = strlen(s)+1;
    
        char *buf = (char*)malloc((offset)*sizeof(char));
        memset(buf, 0, offset);
    
        char *p;
        // iterate from end to begin and count how much words we have
        for (unsigned long i = offset; i != 0; i--) {
            p = s+i;
            // if we discover a whitespace we know that we have a whole word
            if (*p == ' ' || *p == '\0') {
                // we increment the counter
                if (*p != '\0') {
                    // we write the word into the buffer
                    ++p;
                    int d = (int)(strlen(p)-strlen(buf));
                    strncat(buf, p, d);
                    strcat(buf, " ");
                }
            }
        }
    
        // copy the last word
        p -= 1;
        int d = (int)(strlen(p)-strlen(buf));
        strncat(buf, p, d);
        strcat(buf, "\0");
    
        // copy stuff to destination string
        for (int i = 0; i < offset; ++i) {
            *(dest+i)=*(buf+i);
        }
    
        free(buf);
    }
    
    0 讨论(0)
  • 2020-11-22 11:01

    Here is the Java Implementation:

    public static String reverseAllWords(String given_string)
    {
        if(given_string == null || given_string.isBlank())
            return given_string;
    
        char[] str = given_string.toCharArray();
        int start = 0;
    
        // Reverse the entire string
        reverseString(str, start, given_string.length() - 1);
    
        // Reverse the letters of each individual word
        for(int end = 0; end <= given_string.length(); end++)
        {
            if(end == given_string.length() || str[end] == ' ')
            {
                reverseString(str, start, end-1);
                start = end + 1;
            }
        }
        return new String(str);
    }
    
    // In-place reverse string method
    public static void reverseString(char[] str, int start, int end)
    {
        while(start < end)
        {
            char temp = str[start];
            str[start++] = str[end];
            str[end--] = temp;
        }
    }
    
    0 讨论(0)
提交回复
热议问题