2010-04-26 9 views
12

Kann mir jemand sagen, wie man ein Java-Programm schreibt, um einen gegebenen Satz umzukehren?Einen gegebenen Satz in Java umkehren

Zum Beispiel, wenn der Eingang:

"Dies ist eine Interviewfrage"

Der Ausgang sein muss:

"Frage Interview eine ist die"

+0

Sie wahrscheinlich in Betracht ziehen sollten Java Zertifizierung Klassen nehmen, wie sie Sie häufig Java-Bibliothek Klassen unterrichten wird. Sie verfügen dann über die erforderlichen Tools, um diese Aufgaben auszuführen. –

+1

Kehren Sie die Zeichenfolge zuerst um. Kehren Sie die Wörter dann um. Es dauert zwei, aber sehr sauber. Kann auch in 1 Pass durchgeführt werden. – Jack

+1

@jack, Ich denke, dein erstes Wort sollte "geteilt" werden, ja? – CPerkins

Antwort

23

Sie teilen die Zeichenfolge durch das Leerzeichen dann iterieren drüber rückwärts, um den umgekehrten Satz zusammenzusetzen.

+7

Wird dies nicht ein Leerzeichen hinzufügen? – Skilldrick

+2

Gibt es einen Grund, warum Sie mit einem 'String' verketten (der jedes Mal ein neues' String'-Objekt erzeugt), anstatt einen 'StringBuilder' zu verwenden? –

+0

@Christopher Parker - Einfach das Prinzip zeigen. Dies kann natürlich angepasst werden, um (bei Bedarf) leistungsfähiger zu sein. – Oded

6

Teilen Sie es einfach auf ein Leerzeichen in ein String-Array, dann durchlaufen Sie das Array in umgekehrter Reihenfolge und konstruieren Sie den Ausgabe-String.

String input = "This is interview question"; 
String output = ""; 
String[] array = input.split(" "); 
for(int i = array.length-1; i >= 0; i--) 
{ 
    output += array[i]; 
    if (i != 0) { output += " "; } 
} 
+0

können Sie bitte Code ohne Verwendung split() geben – Max

22
String[] words = sentence.split(" "); 
String[] reversedWords = ArrayUtils.reverse(words); 
String reversedSentence = StringUtils.join(reversedWords, " "); 

(mit ArrayUtils und StringUtils von commons-lang, aber diese sind einfache Methoden zu schreiben - nur ein paar Loops)

+7

Verwenden Sie eine externe Bibliothek für eine Interviewfrage dieses einfache geht nicht über so gut. –

+5

gut. Das ist nicht einfach diese Frage Interview für eine Bibliothek außerhalb Using – Powerlord

+5

@ D'Nabre - wenn Sie commons-lang gut genug, um diesen Code zu schreiben, denke ich, es würde sehr gut über gut gehen. –

6

Bozho bereits eine große Java-spezifische Antwort gab, aber in der Ereignis, das Sie jemals brauchen, um dieses Problem ohne Java API Methoden zu lösen:

Um umzukehren, können Sie einfach einzelne Wörter auf eine stack knallen und sie alle wieder abstellen, wenn es keine Wörter mehr gibt.

(Nur um extra klar zu sein, bietet Java eine Stack class, so ist es möglich, diese Methode auch in Java zu verwenden).

3

ein jeder langweilig bisschen java:

List<String> l = new ArrayList<String>(Arrays.asList("this is an interview question".split("\\s"))); 
Collections.reverse(l); 
StringBuffer b = new StringBuffer(); 
for(String s : l){ 
    b.append(s).append(' '); 
} 
b.toString().trim(); 

in groovy ist es ein bisschen besser lesbar:

"this is an interview question" 
    .split("\\s") 
    .reverse() 
    .join(' ') 
+0

@ Oded ist viel netter ... Weg, um nur mit Sammlungen zu verwenden. –

19

Einfach nur anders: eine rekursive Lösung. Fügt keine zusätzlichen Leerzeichen hinzu.

public static String reverse(String s) { 
    int k = s.indexOf(" "); 
    return k == -1 ? s : reverse(s.substring(k + 1)) + " " + s.substring(0, k); 
} 


System.out.println("[" + reverse("This is interview question") + "]"); 
// prints "[question interview is This]" 

Ich werde auch statt durch die Verwendung \b auf der split Lösung verbessern (es ist so offensichtlich!).

String[] parts = "Word boundary is better than space".split("\\b"); 
    StringBuilder sb = new StringBuilder(); 
    for (int i = parts.length; i --> 0 ;) { 
     sb.append(parts[i]); 
    } 
    System.out.println("[" + sb.toString() + "]"); 
    // prints "[space than better is boundary Word]" 
+0

schön, ich mochte das rekursive Lösungsdesign, aber der Iteration + String Builder muss schneller sein, richtig? – user797963

3

ich es auch ausprobieren: Hier ist eine Version einen Stapel und einen Scanner mit:

String input = "this is interview question"; 
Scanner sc = new Scanner(input); 
Stack<String> stack = new Stack<String>(); 

while(sc.hasNext()) { 
    stack.push(sc.next()); 
} 

StringBuilder output = new StringBuilder(); 

for(;;) { // forever 
    output.append(stack.pop()); 

    if(stack.isEmpty()) { 
     break; // end loop 
    } else { 
     output.append(" "); 
    } 
} 
2
public class ReverseString { 

    public void reverse(String[] source) { 

     String dest = ""; 
     for (int n = source.length - 1; n >= 0; n--) { 
      dest += source[n] + " "; 
     } 
     System.out.println(dest); 

    } 

    public static void main(String args[]) { 
     ReverseString rs = new ReverseString(); 
     String[] str = "What is going on".split(" "); 
     rs.reverse(str); 

    } 

} 
1

schöner Ansatz wahrscheinlich .. die Logik somewhere..here gesehen hatte mein Code was könnte den Job machen.

public class revWords { 

    public static void main(String[] args) { 

     revWords obj = new revWords(); 
     String print = obj.reverseWords("I am God"); 
     System.out.println(print); 

    } 

    public String reverseWords(String words) 
    { 
     if(words == null || words.isEmpty() || !words.contains(" ")) 
     return words; 

     String reversed = ""; 
     for(String word : words.split(" ")) 
     reversed = word + " " + reversed; 

     return reversed; 
    } 

} 
1

Ich glaube nicht, dass Sie jede Bibliothek verwendet werden soll .. 1) Reverse ganze Zeichenfolge 2) Reverse jedes Wort.

public static void revWord(char[] a) { 

    // reverse whole 
    revWord(a, 0, a.length); 

    int st = -1; 
    int end = -1; 

    for (int i = 0; i < a.length; i++) { 

     if (st == -1 && a[i] != ' ') { 
      st = i; 
     } 
     if (end == -1 && a[i] == ' ') { 
      end = i; 
     } 
     if(i == a.length-1){ 
      end=i+1; 
     } 

     if (st != -1 && end != -1) { 
      revWord(a, st, end); 

      st = -1; 
      end = -1; 
     } 

    } 

} 

public static void revWord(char[] a, int s, int l) { 
    int mid = (l - s)/2; 
    l--; 

    for (int i = 0; i < mid; i++, l--) { 
     char t = a[s+i]; 
     a[s+i] = a[l]; 
     a[l] = t; 
    } 
} 

`

+1

Dies funktioniert nur mit ASCII-Zeichensatz ... nicht die ideale Lösung. –

0

Niemand hat eine Vanille Java 8 basierte Lösung noch erwähnt, die die gleichen wie Bozho's, aber ohne Bibliotheken von Drittanbietern. Also hier ist es:

String input = "This is interview question"; 

List<String> list = Arrays.asList(input.split(" ")); 
Collections.reverse(list); 
System.out.println(list.stream().collect(Collectors.joining(" "))); 
0

Bevor StringTokenizer wurde erklärt Erbe, viele verwendet StringTokenizer dafür. Ich dachte, ich würde es einfach hier lassen.

String sentence = "This is interview question"; 
String reversed = ""; 
StringTokenizer tokens = new StringTokenizer(sentence); 

while (tokens.hasMoreTokens()) { // Loop through each token 
    reversed = tokens.nextToken() + ' ' + reversed; //add to start 
} 

System.out.println(reversed.trim()); 
1

Bitte versuchen Sie unten Lösung, das funktioniert für mich.

public class reverseline { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

     String str="This is interview question"; 
    String words[]=str.split(" "); 
    for(int i=words.length-1;i>=0;i--){ 
     System.out.print(words[i]+" "); 
    } 
} 

} 
0

Kürzeste Antwort

public class ReverseSentance { 

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    System.out.println("Enter a sentance"); 
    String inputString = sc.nextLine(); 

    String[] words = inputString.split(" "); 

    List<String> reverseWord = Arrays.asList(words); 
    Collections.reverse(reverseWord); 

    Iterator itr = reverseWord.iterator(); 

    while (itr.hasNext()) { 
     System.out.print(itr.next() + " "); 
    } 
} 

}

ODER

public class ReverseSentance { 

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    System.out.println("Enter a sentance"); 
    String inputString = sc.nextLine(); 

    String[] words = inputString.split(" "); 

    for (int i = words.length-1 ; i >= 0; i--) { 
     System.out.print(words[i] +" "); 
    } 
}