Java专家需要你的帮助。
今天我在其中一次采访中被问到这个问题我无法解决。 所以我需要一个解决方案来解决这个问题;
反转字符串
Input : Hello, World!
Output : olleH, dlroW!
在这种情况下,字母数字反转并且休息仍然在同一个地方,这意味着逗号和感叹号保持在同一个地方。
您可以使用仅 4字符串函数来获得答案;
我尝试了以下代码;
public void String(String str){
String temp;
for(int i=str.length-1;i>=0;i--){
temp = temp + str.charAt(i);
}
}
但是上面的代码反转了整个字符串。
答案 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)
您可以尝试使用正则表达式查找所有单词,然后使用匹配器方法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!
答案 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 );
}