0

Java 专家需要您的帮助。

今天在一次我无法解决的采访中被问到这个问题。所以我需要一个关于我应该如何解决这个问题的解决方案;

反转字符串

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

在这种情况下,字母数字反转,其余部分保持在同一个位置,这意味着逗号和感叹号保持在同一个位置。

您只能使用4 个 String 函数来获得答案;

  1. 字符(c)
  2. 长度()
  3. setCharAt(i,c)
  4. boolean isAlphaNumeric()

我尝试了以下代码;

public void String(String str){     
    String temp;

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

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

4

4 回答 4

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!
于 2013-11-02T00:44:58.520 回答
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;
    }
于 2013-11-02T00:38:55.417 回答
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 相当简单,我将其留作练习。该答案旨在成为如何实现此任务的伪代码想法,而不是复制粘贴解决方案。

于 2013-11-02T00:29:00.847 回答
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 );
}
于 2013-11-02T01:16:40.640 回答