Обратная строка слово за словом в Java - PullRequest
6 голосов
/ 02 февраля 2012

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

String str = "hello brave new world";
tStr.reverseWordByWord(str)

public String reverseWordByWord(String str){
        int strLeng = str.length()-1;
        String reverse = "", temp = "";

        for(int i = 0; i <= strLeng; i++){
            temp += str.charAt(i);
            if((str.charAt(i) == ' ') || (i == strLeng)){
                for(int j = temp.length()-1; j >= 0; j--){
                    reverse += temp.charAt(j);
                    if((j == 0) && (i != strLeng))
                        reverse += " ";
                }
                temp = "";
            }
        }

        return reverse;
    }

фраза на данный момент становится такой:

olleh evarb wendlrow

обратите внимание на пробел в начале новой строки.

Ответы [ 34 ]

0 голосов
/ 28 февраля 2017

Вот решение без использования строковых функций, таких как обратный, подстрока, разделение или токенизатор. Мои 2 цента

public String reverseWordByWord(String strToReverse) {
    StringBuilder tempBuilder = new StringBuilder();
    StringBuilder reversedBuilder = new StringBuilder();
    char[] charArray ;
    for (int i=0; i<=strToReverse.length()-1;i++) {

        if (strToReverse.charAt(i) != ' ') {
            tempBuilder.append(strToReverse.charAt(i)); // dont add if space found
        }

        if (strToReverse.charAt(i) == ' ' || i == strToReverse.length()-1) {

            charArray = new String(tempBuilder).toCharArray(); // convert the temp builder to char array (for reversing)

            for (int j=charArray.length-1; j>=0 ;j--) {
                reversedBuilder.append(charArray[j]);
            }
            if ( i != strToReverse.length()-1) // dont add if it is the last character
                reversedBuilder.append(strToReverse.charAt(i));
            tempBuilder = new StringBuilder();
        }
    }
    System.out.println("Word by Word : "+new String(reversedBuilder));

    return new String(reversedBuilder);
}
0 голосов
/ 02 февраля 2012

Итак, я предполагаю, что вы изучаете / практикуете java и что существует большой риск вопроса о домашнем задании ... Это означает, что вы или любите, или ненавидите этот ответ ...

Если вы посмотрите на исходный код объекта String, вы найдете что-то вроде этого внутри:

private final char value[]; //this stores the String's characters

Первый шаг - получить значение [] с помощью:

char[] myChars = str.toCharArray();

Обратите внимание на реализацию функции (из openjdk-7 ), она возвращает копию массива, а не исходную, поскольку объекты String являются неизменяемыми.

public char[] toCharArray() {
    char result[] = new char[count];
    getChars(0, count, result, 0); //Calls System.arraycopy(...)
    return result;
}

Теперь, когда у нас есть myChars, мы можем поиграть с ним и получить результат за линейное время O (n)!

public static String reverseWordByWord(String str) {
    char[] myChars = str.toCharArray();
    int stringLen = myChars.length;

    int left = 0, right = 0;
    for(int index = 0; index < stringLen; index++) {
        if(chars[index] == ' ') {
            //assign right
            reverse(chars, left, right);
            //update left
        }
    }
    //Don't forget to handle the boundary case (last word in the String)!
}

А вот функция реверс :

private static void reverse(char[] chars, int left, int right) {
    while(left < right) {
        //Would you know how to swap 2 chars without using a "char tmp" variable? ;)
        //Update left and right
    }
}

Теперь просто ради интереса вы можете попытаться перейти к следующему выводу, и, возможно, вы получите этот точный вопрос от какого-то интервьюера, который однажды выдохся:

world new brave hello

0 голосов
/ 02 октября 2017

Вот самый простой способ поменять строки слово за словом, используя Arraylist и Tokenizer(). Это хороший выбор ... Посмотрите на это:

import java.util.*;

class ReverseWords{

  public static void main(String args[]){

    Scanner sc = new Scanner(System.in);

    System.out.println(" Please Enter The String \n");
      String st=sc.nextLine();

    //Using ArrayList
      ArrayList<String> List =new ArrayList<String>();
      StringTokenizer tokens=new StringTokenizer(st);

        while(tokens.hasMoreTokens()){
            List.add(tokens.nextToken());
        }
    Collections.reverse(List);

    Iterator itr=List.iterator();  
    while(itr.hasNext()){  
       System.out.print(itr.next()+" ");  
    }  

  }
}
0 голосов
/ 09 апреля 2013

Я думаю, что мой код ниже эффективнее любого кода, доступного здесь:

public static void revWordsInStringCStyle(String str){
    char [] str_ch = str.toCharArray();
    System.out.println(str);
    char temp;
    int len = str_ch.length;
    int left = len-1;

    for(int right =0; right<len/2 ;right++){
        temp = str_ch[left];
        str_ch[left] = str_ch[right];
        str_ch[right] = temp;
        left--;
    }

    for(int i =0; i < len ; i++){
        System.out.print(str_ch[i]);

    }

}

Пример: "hello world"

станет: "dlrowolleho "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...