Что не так с этим кодом для печати обратной фразы при сохранении порядка? - PullRequest
0 голосов
/ 05 марта 2011
public String reverse(String sentence){
    String reverse = "";
    char [] s = sentence.toCharArray();
    int first = s.length-1;
    int last = s.length-1;
    String temp = "";

    for(int i = s.length-1; i>=0; i--){
        temp = " ";
        while(s[first] != ' '){
            System.out.println(s[first]);
            first--;

        }
        while(last != first){
            temp = s[last] + temp;
            last--;
            i--; 
        }            
        reverse = reverse + temp;
    }
    return reverse;
}

Мой ввод: Something for test.

Ожидаемый вывод: test. for Something

Мой фактический вывод: test.

Пожалуйста, дайте мне знать, чтоне так с этим?Я знаю, что это долгий путь, но я пытался свести к минимуму использование легкодоступных функций.

Ответы [ 3 ]

3 голосов
/ 05 марта 2011

Если вы хотите изменить слова в предложении, я сделаю это следующим образом:

public String reverse(String sentence) {
    String[] words = sentence.split(" ");
    String ret = "";
    for(int i = words.length - 1; i >= 0; i--) {
        ret += words + " ";
    }
    return ret;
}

Если вы хотите придерживаться своего подхода, вы можете использовать lastIndexOf(int) метод, чтобы найти все пробелы вместо циклического в CharSequence, а затем метод subString для извлечения каждого слова.

2 голосов
/ 05 марта 2011

Когда вы выполняете цикл в первый раз и сначала уменьшаете его, в конце цикла s [first] указывает на ' '.Когда вы попадаете в цикл for во второй раз, тест

while(s[first] != ' ')

завершается неудачей, поскольку s [first] по-прежнему указывает на ' ', который вы остановили в последний раз.Следовательно, вы получите только самое последнее слово и ничего более.

Попробуйте сначала уменьшить значение перед тем, как закончить цикл.

0 голосов
/ 05 марта 2011

Это дает вывод, потому что вы уменьшаете i здесь:

    while(last != first){
        temp = s[last] + temp;
        last--;
        i--; 
    }     

Есть два способа сделать это правильно, но если вы собираетесь сделать это таким образом, вы должны использовать любую строкуБиблиотека там, чтобы разрезать строку для вас.Вдобавок ко всему, ваш текущий алгоритм заставит first пройти минус 0 в отрицательные значения, что приведет к некоторой ошибке, предположительно.

public String reverse(String sentence){
    String reverse = "";
    char [] s = sentence.toCharArray();
    int first = s.length-1;
    int last = s.length-1;
    String temp = "";

    for(int i = s.length-1; i>=0; i--){
        while(s[first] != ' ' && first!=0){
            first--;
        }
        if (first!=0) temp = s.substring(first+1, last);
          else temp = s.substring(first, last);
        last=first;
        reverse = reverse + temp + " ";
    }

    return reverse;
}

Если по какой-либо причине вы не хотитеиспользовать подстроку и вместо этого хотеть сохранить свой исходный алгоритм, тогда все, что ему нужно, это удаление строки i--;.

(я вижу, что кто-то другой опубликовал ответ, используя split(" "), что, вероятно,быть еще лучше.)

...