2012-05-09 5 views
1

Im чтение книги «Programming интервью открытых» и следующий вопрос мне был интересен:Напишите функцию, которая меняет порядок слов в строке?

Написать функцию, которая изменяет порядок слов в строке. Например, для ваша функция должна преобразовать строку «Do or do not», нет попытки. «To» попробуйте. нет, нет, делай или делай ». Предположим, что все слова являются пробелами и обрабатывают знаки пунктуации так же, как буквы.

этот образ был включен, чтобы помочь с разработкой алгоритма:

enter image description here

что является наиболее эффективным способом реализации этого в JAVA?

+0

мой код - беспорядок, слишком смущенный, чтобы опубликовать его здесь. –

+2

Если вы учитесь, я полагаю, вы не должны смущаться этим? – maress

+0

@BluesRockAddict Нет, обратное на уровне слова. –

ответ

1

Ну, я надеюсь, что это не для домашнего задания, но вот один из способов сделать это:

String input = "piglet quantum"; 
String[] words = input.split(" "); 
String result = ""; 
for(String word : words) { 
    result = word + " " + result; 
} 
// This is to remove the extra space (sorry!) 
result = result.substring(0, result.length() - 1); 

Но это не строго следовать методу, описанному в изображении. Они хотят, чтобы вы относились к словам как к массивам, поэтому они могли бы использовать substring() и charAt(), чтобы справиться с этим.

+0

Это добавит дополнительное пространство и конец слова. –

+0

это O (n^2)! – maress

+1

В Java было бы довольно глупо начинать возиться с подстрокой и charAt, так как у нас есть метод высокого уровня, называемый split. Так я и сделал бы это, я голосую за ваш ответ.:) – ZeroOne

5
final List<String> a = Arrays.asList("Do or do not, there is no try.".split("\\s+")); 
Collections.reverse(a); 
final Iterator<String> it = a.iterator(); 
final StringBuilder b = new StringBuilder(it.next()); 
while (it.hasNext()) { b.append(" "); b.append(it.next()); } 
System.out.println(b); 
+1

Почему вы используете последнее ключевое слово здесь? –

+0

Это мой стиль. Я всегда использую его. Вы попадаете в эту привычку, когда функциональный язык является вашим первым языком. Преимущество: улучшенная читаемость, спокойствие, что var не нуждается в изменении в процессе, но только как именованный промежуточный результат. –

+0

Имейте плюс для трюка итератора, и вам нужно будет посмотреть, смогу ли я адаптировать это для .net, никогда не делал этого, как я делал это. –

1

Вот очень простой способ сделать это:

String theInput = "Do or do not, there is no try.”; 

String[] wordArray = theInput.split(" "); 
String[] reverseWordArray = new String[wordArray.length]; 

int j = 0; 
for (int i = wordArray.length; i > 0; i --) { 
    reverseWordArray[j++] = wordArray[i-1]; 
} 
0

Вот путь низкий (-er) уровень (я думаю):

String in = "piglet quantum"; 
String out = ""; 

for(int i = in.length()-1; i >= 0; i+=0) { 
    out += in.substring(in.lastIndexOf(" ", i-1), i)+" "; 
    i = in.lastIndexOf(" ", i-1); 
} 

out.substring(0, out.length()-1); 

Как я уже сказал, не уверен, работает ли это или нет, но я думаю, что так будет.

Я не знаю, что делать для последнего условия в for, если у кого есть предложение. Он ничего не должен делать.

+0

Индекс строки за пределами диапазона: -1 в java.lang.String.substring (Неизвестный источник) –

0

BreakIterator также вариант:

import java.text.BreakIterator; 

public class ReverseWord { 

    public static void main(String[] args) { 
     String source = "piglet quantum"; 
     BreakIterator boundary = BreakIterator.getWordInstance(); 
     boundary.setText(source); 
     int end = boundary.last(); 
     StringBuilder sb = new StringBuilder(); 
     for (int start = boundary.previous(); start != BreakIterator.DONE; end = start, start = boundary.previous()) { 
      sb.append(source.substring(start, end)); 
     } 
     String reversed = sb.toString(); 
     System.err.println("'" + reversed + "'"); 
    } 
} 

И это выводит:

'квантовая Пятачок'

2

Разделить слова на основе spaces.Put слов в стека и выскакивать слова, когда вы достигаете конца строки.

//push elements onto stack 
for(int k =0; k < strtest.length ; k++) 
{ 
     if(strtest[k]!=null) 
     { 
      stack.push(strtest[k]); 
     } 
} 
StringBuffer b1 = new StringBuffer(""); 
// pop and put in stringbuffer 
while(!stack.isEmpty()) 
{ 
    b1 = b1.append(stack.pop()); 
    b1.append(" "); 
} 
Смежные вопросы