2013-11-02 96 views
0

Java專家需要您的幫助。如何反轉字符串中的每個單詞(單獨)?

今天我在一個我無法解決的採訪中被問到這個問題。 所以我需要一個解決方案,我應該如何解決這個問題;

沖銷字符串

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

在這種情況下,字母數字顛倒作息保持,這意味着逗號和驚歎號留在他們的同一個地方同一個地方。

您可以利用只有 4字符串函數來獲得答案;

  1. 的charAt(c)中
  2. 長度()
  3. setCharAt(I,C)
  4. 布爾isAlphaNumeric()

我嘗試以下的代碼;

public void String(String str){  
    String temp; 

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

但上面的代碼反轉了整個字符串。

+2

小心你使用的話:「就地「通常表示在相同的存儲位置而不創建另一個副本。而且,由於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]); 
    } 
} 

編輯:

我剛讀出的變化的問題指定可使用的方法。在這個特定情況下用一個手動實現來替換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

應該使用第四種方法:'isAlphaNumeric()' – user2864740

+0

+1我相信這是正確的答案。無論如何,對於它的小升級版本,請訪問http://pastebin.com/FWmaCmEz – Pshemo

2

你可以嘗試找到與正則表達式的所有單詞,然後使用匹配器方法appendReplacementappendTail與反向版本替換成立的話。出示單詞的反向版本,你可以使用

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

雖然我'在現實生活中使用這個答案,OP有一些愚蠢的面試要求:「你可以使用只有4個字符串函數來得到答案; 1)charAt(c)2)length()3)setCharAt(i,c )4)布爾isAlphaNumeric()「 – user2864740

+1

@hasan這就是爲什麼我upvoted你的答案。無論如何,在現實生活中,您可以使用for for循環(如for(char ch:str.toCharArray()){...})進行更高級的升級,在循環中追加到StringBuilder而不是'someString + = anotherString',並使用' Character.isDigit(ch)|| Character.isAlphabetic(ch)'in'if'。無論如何,你的答案應該被接受。 – Pshemo

0

setCharAt不是字符串函數的字符串是不可改變的,但是你可以用char數組或StringBuilder(它只是包裝一個char數組)來做到這一點。 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); 
} 
相關問題