Reverse the ordering of words in a string

后端 未结 30 4191
青春惊慌失措
青春惊慌失措 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条回答
  •  旧时难觅i
    2020-11-22 11:14

    Most of these answers fail to account for leading and/or trailing spaces in the input string. Consider the case of str=" Hello world"... The simple algo of reversing the whole string and reversing individual words winds up flipping delimiters resulting in f(str) == "world Hello ".

    The OP said "I want to reverse the order of the words" and did not mention that leading and trailing spaces should also be flipped! So, although there are a ton of answers already, I'll provide a [hopefully] more correct one in C++:

    #include 
    #include 
    
    void strReverseWords_inPlace(std::string &str)
    {
      const char delim = ' ';
      std::string::iterator w_begin, w_end;
      if (str.size() == 0)
        return;
    
      w_begin = str.begin();
      w_end   = str.begin();
    
      while (w_begin != str.end()) {
        if (w_end == str.end() || *w_end == delim) {
          if (w_begin != w_end)
            std::reverse(w_begin, w_end);
          if (w_end == str.end())
            break;
          else
            w_begin = ++w_end;
        } else {
          ++w_end;
        }
      }
    
      // instead of reversing str.begin() to str.end(), use two iterators that
      // ...represent the *logical* begin and end, ignoring leading/traling delims
      std::string::iterator str_begin = str.begin(), str_end = str.end();
      while (str_begin != str_end && *str_begin == delim)
        ++str_begin;
      --str_end;
      while (str_end != str_begin && *str_end == delim)
        --str_end;
      ++str_end;
      std::reverse(str_begin, str_end);
    }
    

提交回复
热议问题