2013-11-02 5 views
0

Java-специалисты нуждаются в вашей помощи.Как отменить каждое слово (индивидуально) в строке?

Сегодня меня задавали эти вопросы в одном из интервью, которые я не мог решить. Так что мне нужно решение, как я должен это решить;

реверс строки

Input : Hello, World! 
Output : olleH, dlroW! 

В этом случае буквенно-цифровой переворачивает и остальное остается в том же месте, что означает, что запятую и восклицательные остается в их же месте.

Вы можете использовать только 4 Строковые функции, чтобы получить ответ;

  1. Шара (с)
  2. длина()
  3. setCharAt (я, с)
  4. булево isAlphaNumeric()

Я попытался следующий код;

public void String(String str){  
    String temp; 

    for(int i=str.length-1;i>=0;i--){ 
     temp = temp + str.charAt(i); 
    } 
} 

Но приведенный выше код отменяет всю строку.

+2

Тщательных слов, которые вы используете: «INPLACE msgstr "обычно означает, что в том же месте памяти не создается другая копия. И, поскольку строки Java неизменяемы, это невозможно. – paxdiablo

ответ

0

Начните с разделения строки на слова с помощью str.split('[^a-zA-Z]').

Затем проведите через массив и отмените каждую часть, как вы делали выше. Наконец, снова присоедините строку. Чтобы получить массив сепараторов в порядке, просто используйте str.split('[a-zA-Z]')

Пример:

String[] words=str.split('[^a-zA-Z]'); 
String[] separators=str.split('[a-zA-Z]'); 

//Left as an exercise: reverse each element of the words array (as you did in the original question) 

int offset=0; 
//Left as an exercise: If the sentence starts with punctuation, increment offset by one and insert the punctuation at the beginning 

StringBuilder sb = new StringBuilder(); 
for(int i=0;i<words.length;i++) 
{ 
    sb.append(words[i]); 
    if(i+offset<separators.length) 
    { 
     sb.append(separators[i+offset]); 
    } 
} 

EDIT:

Я только что прочитал изменения в вопросе определения того, какие могут быть использованы методы. Достаточно просто заменить split на ручную реализацию для этого конкретного случая, и я оставляю его как упражнение. Этот ответ предназначен для псевдокодной идеи о том, как реализовать эту задачу, а не в решении для копирования-вставки.

+0

, пожалуйста, прочитайте вопрос .. спасибо – skyrocker

2
public String reverseString(String str){  
     String temp = "", result = ""; 
     for(int i=0;i<str.length();i++) 
      if ((str.charAt(i)>='A' && str.charAt(i)<='Z') 
       || (str.charAt(i)>='a' && str.charAt(i)<='z') 
       || (str.charAt(i)>='0' && str.charAt(i)<='9')) 
       temp = str.charAt(i) + temp; 
      else { 
       result += temp + str.charAt(i); 
       temp = ""; 
      } 

     result += temp; 
     System.out.println(result); 
     return result; 
    } 
+0

Должен использовать 4-й метод: 'isAlphaNumeric()' – user2864740

+0

+1 Я считаю, что это правильный ответ. Во всяком случае, для его небольшой обновленной версии посетите http://pastebin.com/FWmaCmEz – Pshemo

2

Вы можете попытаться найти все слова с регулярным выражением, а затем использовать метод Matchers appendReplacement и appendTail заменить обоснованные слова с перевернутой версией. Для получения перевернутой версии слова, которое вы можете использовать

StringBuilder().append(word).reverse().toString(); 

Вот как вы можете сделать это

public static void main(String[] args) throws Exception { 
    Pattern p = Pattern.compile("\\p{IsAlphabetic}+"); 

    StringBuffer sb = new StringBuffer(); 

    Matcher m = p.matcher("Hello, World!"); 
    while (m.find()) { 
     m.appendReplacement(sb, reverseWord(m.group())); 
    } 
    m.appendTail(sb); 

    System.out.println(sb); 
} 

private static String reverseWord(String word) { 
    return new StringBuilder().append(word).reverse().toString(); 
} 

выход:

olleH, dlroW! 
+0

+1 Очень приятно. Я никогда не понимал appendReplacement/appendTail раньше! Также кажется, что это должно показать кого-то в ответе на мой недавний вопрос (http://stackoverflow.com/questions/19737653/one-off-equivalent-for-regex-replace-with-function-evaluation) – user2864740

+0

Пока я 'd использовать этот ответ в реальной жизни, OP имеет некоторые глупые требования к интервью: «Вы можете использовать только 4 функции String, чтобы получить ответ: 1) charAt (c) 2) length() 3) setCharAt (i, c) 4) boolean isAlphaNumeric() " – user2864740

+1

@hasan Вот почему я поддержал ваш ответ. В любом случае, в реальной жизни вы можете еще больше обновить его, используя расширенный для цикла, например 'for (char ch: str.toCharArray()) {...}', добавляя в StringBuilder вместо 'someString + = anotherString' в цикле и используя' Character.isDigit (ch) || Character.isAlphabetic (ch) 'in' if'. В любом случае, ваш ответ должен быть принят. – Pshemo

0

setCharAt это не строковые функции, как строка неизменна, однако вы можете сделать это с помощью массива char или StringBuilder (который просто обертывает массив символов). isAlphaNumeric не является стандартным методом в любом месте, где я могу найти, но Character.isAlphabetic - это то, что я считаю вам нужным.Это, используя так близко, как я мог добраться до следующего ваших ограничений:

private static CharSequence reverseWords(CharSequence in) 
{ 
    StringBuilder sb = new StringBuilder(in); 
    for(int i = 0, len = sb.length(); i < len; i++) 
    { 
     if(Character.isAlphabetic(sb.charAt(i))) 
     { 
      int end = i; 
      while(++end < len && Character.isAlphabetic(sb.charAt(end))); 
      int j = end - 1; 
      while(j > i) 
      { 
       char temp = sb.charAt(i); 
       sb.setCharAt(i++, sb.charAt(j)); 
       sb.setCharAt(j--, temp); 
      } 
      i = end; 
     } 
    } 
    return sb; 
} 

Однако, если вы хотите использовать массив символов непосредственно без StringBuilder:

private static String reverseWords(String in) 
{ 
    char[] chars = in.toCharArray(); 
    for(int i = 0, len = chars.length; i < len; i++) 
    { 
     if(Character.isAlphabetic(chars[i])) 
     { 
      int end = i; 
      while(++end < len && Character.isAlphabetic(chars[end])); 
      int j = end - 1; 
      while(j > i) 
      { 
       char temp = chars[i]; 
       chars[i++] = chars[j]; 
       chars[j--] = temp; 
      } 
      i = end; 
     } 
    } 
    return String.valueOf(chars); 
} 
Смежные вопросы