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

前端 未结 21 1798
[愿得一人]
[愿得一人] 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 05:03

    O(N) in space and O(N) in time solution in Python:

    def reverse_words_nosplit(str_):
      """
      >>> f = reverse_words_nosplit
      >>> f("this is a string")
      'string a is this'
      """
      iend = len(str_)
      s = ""
      while True:
        ispace = str_.rfind(" ", 0, iend)
        if ispace == -1:
          s += str_[:iend]
          break
        s += str_[ispace+1:iend]
        s += " "
        iend = ispace
      return s
    
    0 讨论(0)
  • 2020-11-28 05:06

    Algorithm: 1).Reverse each word of the string. 2).Reverse resultant String.

    public class Solution {
    public String reverseWords(String p) {
       String reg=" ";
      if(p==null||p.length()==0||p.equals(""))
    {
        return "";
    }
    String[] a=p.split("\\s+");
    StringBuilder res=new StringBuilder();;
    for(int i=0;i<a.length;i++)
    {
    
        String temp=doReverseString(a[i]);
        res.append(temp);
        res.append(" ");
    }
    String resultant=doReverseString(res.toString());
    System.out.println(res);
    return resultant.toString().replaceAll("^\\s+|\\s+$", ""); 
    }
    
    
    public String doReverseString(String s)`{`
    
    
    char str[]=s.toCharArray();
    int start=0,end=s.length()-1;
    while(start<end)
    {
    char temp=str[start];
    str[start]=str[end];
    str[end]=temp;
    start++;
    end--;
    }
    String a=new String(str);
    return a;
    
    }
    
    public static void main(String[] args)
    {
    Solution r=new Solution();
    String main=r.reverseWords("kya hua");
    //System.out.println(re);
    System.out.println(main);
    }
    }
    
    0 讨论(0)
  • 2020-11-28 05:07

    In C: (C99)

    #include <stdio.h>
    #include <string.h>
    
    void reverseString(char* string, int length)
    {
        char swap;
        for (int i = 0; i < length/2; i++)
        {
            swap = string[length - 1 - i];
            string[length - 1 - i] = string[i];
            string[i] = swap;
        }   
    }
    
    int main (int argc, const char * argv[]) {
        char teststring[] = "Given an array of characters which form a sentence of words, give an efficient algorithm to reverse the order of the words (not characters) in it.";
        printf("%s\n", teststring);
        int length = strlen(teststring);
        reverseString(teststring, length);
        int i = 0;
        while (i < length)
        {
            int wordlength = strspn(teststring + i, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz");
            reverseString(teststring + i, wordlength);
            i += wordlength + 1;
        }
        printf("%s\n", teststring);
        return 0;
    }
    

    This gives output:

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

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

    This takes at most 4N time, with small constant space. Unfortunately, It doesn't handle punctuation or case gracefully.

    0 讨论(0)
提交回复
热议问题