2013-11-02 94 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); 
} 
相关问题