如何反转字符串中的每个单词(单独)?

时间:2013-11-02 00:24:23

标签: java string reverse

Java专家需要你的帮助。

今天我在其中一次采访中被问到这个问题我无法解决。 所以我需要一个解决方案来解决这个问题;

反转字符串

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

在这种情况下,字母数字反转并且休息仍然在同一个地方,这意味着逗号和感叹号保持在同一个地方。

您可以使用 4字符串函数来获得答案;

  1. 的charAt(c)中
  2. 长度()
  3. setCharAt(I,C)
  4. boolean isAlphaNumeric()
  5. 我尝试了以下代码;

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

    但是上面的代码反转了整个字符串。

4 个答案:

答案 0 :(得分: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;
    }

答案 1 :(得分: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!

答案 2 :(得分: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是相当简单的,我把它留作练习。这个答案是关于如何实现这个任务的伪代码,而不是复制粘贴解决方案。

答案 3 :(得分:0)

setCharAt不是字符串函数,因为String是不可变的,但是您可以使用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的情况下直接使用char数组:

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 );
}