2015-12-06 3 views
0

Учитывая строку со словами. Восстанавливающие слова строки.Ouput of Reversing words of String не подходит, как ожидалось

Пример ввода 1

Hello World

Пример вывода

World Hello

MyApproach

Чтобы изменить слова, которые я первый подсчитывал, сколько пространства есть. После этого я сохранил их спа ce в массиве. Используя lastIndex, я напечатал последние элементы массива. После этого я напечатал последние 2 слова массива.

static String reverseWords(String inputString) 
{ 
    int l1=inputString.length(); 
    int count=1; 
    for(int i=0;i<l1;i++) 
    { 
     char ch=inputString.charAt(i); 
     if(ch==' ') 
     { 
      count++; 
     } 
    } 

    int k=0; 
    int[] spaceindex=new int[count]; 
    spaceindex[0]=0; 
    k++; 
    for(int i=0;i<l1;i++) 
    { 
     char ch=inputString.charAt(i); 
     if(ch==' ') 
     { 
      spaceindex[k++]=i+1; 
     } 
    } 

    int p=spaceindex.length-1; 
    String strnew=""; 
    for(int j=spaceindex[p];j<l1;j++) 
    { 
     char c=inputString.charAt(j); 
     strnew=strnew+c; 
    } 


    p--; 
    while(p>=0) 
    { 
     for(int j=spaceindex[p];;j++) 
      { 

       char c=inputString.charAt(j); 
       if(c==' ') 
       { 
        break; 
       } 
       strnew=strnew+c; 

      } 

    } 
    return strnew; 
} 

InputParameters  ActualOutput      Expected Output 

Hello World   WorldHelloWorldHello(Infinite loop) WorldHello 

@Edit Я спросил, почему код, который я написал в wrong.I судимым без использования каких-либо встроенных функций (что было необходимо для меня) .В этом, как я думаю, не дублировать Ans по мне.

Может ли кто-нибудь указать мне, что пошло не так в моем коде.

+0

Вы можете использовать String.split разделить на символ пробела, то просто измените порядок массива, который он вам дает. – Berger

+0

Когда вы проходите через свой код в своем отладчике, что вы видите? Где вы меняете 'p' внутри своего цикла, чтобы он мог остановиться? Можете ли вы попробовать использовать форматтер в своей среде IDE, чтобы ваш код был легче читать? –

+0

@Berger Я предполагаю, что это домашняя работа;) –

ответ

1

Проблема в коде была петля в то время как:

while(p>=0) { 
     strnew = strnew + " "; 
     for(int j=spaceindex[p];;j++) { 
      char c=inputString.charAt(j); 
      if(c==' '){ 
       break; 
      } 
      strnew=strnew+c; 
     } 
     p--; 
} 

Добавление p-- предотвратит петлю за происходящее бесконечно. Также вставка strnew = strnew + " "; после цикла while обеспечивает пространство между каждым словом.

+0

Я думаю, что ваши Ans безупречны. Поскольку вы проверили код. + 1 для этого. Другие Ans были правильными, но они предназначены для ссылки, чтобы сделать мой жесткий код немного легким. Спасибо, что работали. –

3

Простое решение:

public static void main(String[] args) { 

    String x = "Hello World"; 
    String[] xArray = x.split(" "); 
    String result = ""; 

    for (int i = xArray.length - 1; i >= 0; i--) { 
     result += xArray[i] + " "; 
    } 
    System.out.println(result.trim()); // World Hello 
    } 
+1

У вас здесь есть дополнительное пространство. – Berger

+0

Я не понимаю, не могли бы вы объяснить, где дополнительное пространство, пожалуйста? –

+0

За последним добавленным словом не следует пробел, поэтому в конце строки результата есть дополнительное пространство. – Berger

1

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

Наличие массива символов (конвертировать, если необходимо, поскольку String является неизменным), сначала отменить все символы в массиве. Во-вторых, цикл над пробелами и для каждого слова обратные символы в слове.

1

Вы можете использовать StringTokenizer для преобразования строки в токены или функцию String.split. Вы можете подталкивать эту коллекцию в стек и извлекать элементы в обратном порядке. Чтобы присоединиться к строкам назад, вы можете использовать StringBuilder или StringBuffer.

Чтобы сделать это более эффективно можно преобразовать строку в массив символов и StringBuilders

String myString = "Here is the String"; 
char[] myChars = myString.toCharArray(); 

StringBuilder word = new StringBuilder(); 
StringBuilder newString = new StringBuilder(); 
for(int i = myChars.length - 1; --i >= 0;) { 
    char c = myChars[i]; 
    if(c == ' ') { 
     newString.append(c); 
     newString.append(word); 
     word = new StringBuilder(); 
    } else { 
     word.append(c); 
    } 
} 
1

Я бы базировать реализацию на String.lastIndexOf(int) и String.substring(int, int). Я получил с StringBuilder для построения выходных «предложений» и while loop для повторения слов в обратном порядке.Нечто подобное,

static String reverseWords(String in) { 
    StringBuilder sb = new StringBuilder(in.length()); 
    int space; 
    while ((space = in.lastIndexOf(' ')) > 0) { 
     sb.append(in.substring(space + 1, in.length())).append(' '); 
     in = in.substring(0, space); 
    } 
    sb.append(in); 
    return sb.toString(); 
} 

Что я тестировал с предоставленным образцом

public static void main(String[] args) { 
    System.out.println(reverseWords("Hello World")); 
} 

Getting (как и ожидалось)

World Hello