Reverse the ordering of words in a string

后端 未结 30 3803
青春惊慌失措
青春惊慌失措 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 11:09

    My version of using stack:

    public class Solution {
        public String reverseWords(String s) {
            StringBuilder sb = new StringBuilder();
            String ns= s.trim();
            Stack<Character> reverse = new Stack<Character>();
            boolean hadspace=false;
    
            //first pass
            for (int i=0; i< ns.length();i++){
                char c = ns.charAt(i);
                if (c==' '){
                    if (!hadspace){
                        reverse.push(c);
                        hadspace=true;
                    }
                }else{
                    hadspace=false;
                    reverse.push(c);
                }
            }
            Stack<Character> t = new Stack<Character>();
            while (!reverse.empty()){
                char temp =reverse.pop();
                if(temp==' '){
                    //get the stack content out append to StringBuilder
                    while (!t.empty()){
                        char c =t.pop();
                        sb.append(c);
                    }
                    sb.append(' ');
                }else{
                    //push to stack
                    t.push(temp);
                }
            }
            while (!t.empty()){
                char c =t.pop();
                sb.append(c);
            }
            return sb.toString();
        }
    }
    
    0 讨论(0)
  • 2020-11-22 11:10

    Store Each word as a string in array then print from end

    public void rev2() {
        String str = "my name is ABCD";
        String A[] = str.split(" ");
    
        for (int i = A.length - 1; i >= 0; i--) {
            if (i != 0) {
                System.out.print(A[i] + " ");
            } else {
                System.out.print(A[i]);
            }
        }
    
    }
    
    0 讨论(0)
  • 2020-11-22 11:11

    In Smalltalk:

    'These pretzels are making me thirsty' subStrings reduce: [:a :b| b, ' ', a]
    

    I know noone cares about Smalltalk, but it's so beautiful to me.

    0 讨论(0)
  • 2020-11-22 11:11
    class Program
    {
        static void Main(string[] args)
        {
            string s1 =" My Name varma:;
            string[] arr = s1.Split(' ');
            Array.Reverse(arr);
            string str = string.Join(" ", arr);
            Console.WriteLine(str);
            Console.ReadLine();
    
        }
    }
    
    0 讨论(0)
  • 2020-11-22 11:11

    In Java using an additional String (with StringBuilder):

    public static final String reverseWordsWithAdditionalStorage(String string) {
        StringBuilder builder = new StringBuilder();
    
        char c = 0;
        int index = 0;
        int last = string.length();
        int length = string.length()-1;
        StringBuilder temp = new StringBuilder();
        for (int i=length; i>=0; i--) {
            c = string.charAt(i);
            if (c == SPACE || i==0) {
                index = (i==0)?0:i+1;
                temp.append(string.substring(index, last));
                if (index!=0) temp.append(c);
                builder.append(temp);
                temp.delete(0, temp.length());
                last = i;
            }
        }
    
        return builder.toString();
    }
    

    In Java in-place:

    public static final String reverseWordsInPlace(String string) {
        char[] chars = string.toCharArray();
    
        int lengthI = 0;
        int lastI = 0;
        int lengthJ = 0;
        int lastJ = chars.length-1;
    
        int i = 0;
        char iChar = 0;
        char jChar = 0;
        while (i<chars.length && i<=lastJ) {
            iChar = chars[i];
            if (iChar == SPACE) {
                lengthI = i-lastI;
                for (int j=lastJ; j>=i; j--) {
                    jChar = chars[j];
                    if (jChar == SPACE) {
                        lengthJ = lastJ-j;
                        swapWords(lastI, i-1, j+1, lastJ, chars);
                        lastJ = lastJ-lengthI-1;
                        break;
                    }
                }
                lastI = lastI+lengthJ+1;
                i = lastI;
            } else {
                i++;
            }
        }
    
        return String.valueOf(chars);
    }
    
    private static final void swapWords(int startA, int endA, int startB, int endB, char[] array) {
        int lengthA = endA-startA+1;
        int lengthB = endB-startB+1;
    
        int length = lengthA;
        if (lengthA>lengthB) length = lengthB;
    
        int indexA = 0;
        int indexB = 0;
        char c = 0;
        for (int i=0; i<length; i++) {
            indexA = startA+i;
            indexB = startB+i;
    
            c = array[indexB];
            array[indexB] = array[indexA];
            array[indexA] = c;
        }
    
        if (lengthB>lengthA) {
            length = lengthB-lengthA;
            int end = 0;
            for (int i=0; i<length; i++) {
                end = endB-((length-1)-i);
                c = array[end];
                shiftRight(endA+i,end,array);
                array[endA+1+i] = c;
            }
        } else if (lengthA>lengthB) {
            length = lengthA-lengthB;
            for (int i=0; i<length; i++) {
                c = array[endA];
                shiftLeft(endA,endB,array);
                array[endB+i] = c;
            }
        }
    }
    
    private static final void shiftRight(int start, int end, char[] array) {
        for (int i=end; i>start; i--) {
            array[i] = array[i-1];
        }
    }
    
    private static final void shiftLeft(int start, int end, char[] array) {
        for (int i=start; i<end; i++) {
            array[i] = array[i+1];
        }
    }
    
    0 讨论(0)
  • 2020-11-22 11:12

    Here is a C implementation that is doing the word reversing inlace, and it has O(n) complexity.

    char* reverse(char *str, char wordend=0)
    {
        char c;
        size_t len = 0;
        if (wordend==0) {
            len = strlen(str);
        }
        else {
            for(size_t i=0;str[i]!=wordend && str[i]!=0;i++)
                len = i+1;
        }
                for(size_t i=0;i<len/2;i++) {
                    c = str[i];
                    str[i] = str[len-i-1];
                    str[len-i-1] = c;
                }
        return str;
    }
    
    char* inplace_reverse_words(char *w)
    {
        reverse(w); // reverse all letters first
        bool is_word_start = (w[0]!=0x20);
    
        for(size_t i=0;i<strlen(w);i++){
            if(w[i]!=0x20 && is_word_start) {
                reverse(&w[i], 0x20); // reverse one word only
                is_word_start = false;
            }
            if (!is_word_start && w[i]==0x20) // found new word
                is_word_start = true;
        }
        return w;
    }
    
    0 讨论(0)
提交回复
热议问题