2017-07-02 78 views
0

我想颠倒字符串中的字词。考虑一个字符串'我的名字是abc'。预期产出应该是'cba si eman yM'。但我的输出是'cba si emanyM'。最终的空格字符有问题。有人能帮我吗?颠倒字符串的字符

我一个试图从终端 这里反向字符串的代码

void reverse(String str) 
{ 
    int i = str.length() - 1; 
    char[] arr = str.toCharArray(); 
    for(int j = arr.length - 1; j > 0; j--){ 
     if(arr[j] == ' '){ 
      swap(arr,i, j); 
      i = j - 1; 
     } 
    } 
    System.out.println(new String(arr).toString()); 
} 

void swap(char[] s,int start, int end){ 
    while(start > end){ 
     char temp = s[start]; 
     s[start] = s[end]; 
     s[end] = temp; 
     start --; 
     end++; 
    } 
} 
public static void main(String args[]) 
{ 
    String str = "My name is abc"; 
    ReversWords r = new ReversWords(); 
    r.reverse(str); 
} 
+0

应该'同时(开始>结束){'是'而(启动<结束){'也许? –

+0

任何原因你不只是使用堆栈? –

+1

'System.out.println(new StringBuilder(str).reverse());' –

回答

2

正如我在评论所指出的,所需的输出:

CBA SI埃曼y M的

暗示你不想扭转的每个单词,但简单地颠倒整个字符串。

然而,让我们假设这是错误的,并为您的标题说,要扭转每个单词的字母,都保持原有顺序的话,那么你想要的输出是:

y M的埃曼SI CBA

当我运行代码,输出我得到的是:

Myeman SI CBA

主要的问题是,只有在它们前面有一个空格时,才会反转单词。第一个词这个测试失败了。在reverse中,在退出循环之后,在打印结果之前,需要从0交换到i

您还有一个问题,即空格在交换的单词的尾部结束,这就是为什么“我的”和“名称”之间的空间似乎消失了。换句话说,如果在地方的每个空间的印有“_”,当前的代码的输出是:

Myeman_si_cba_

为了解决这个问题,当你调用swap不包括空间。然后reverse方法应该是这样的:

void reverse(String str) { 
    int i = str.length() - 1; 
    char[] arr = str.toCharArray(); 
    for(int j = arr.length - 2; j > 0; j--){ 
     if(arr[j] == ' '){ 
      swap(arr,i, j + 1); 
      i = j - 1; 
     } 
    } 
    swap(arr, i, 0); 
    System.out.println(new String(arr).toString()); 
} 

输出:

y M的埃曼SI CBA

0

您不必检查什么。你可以盲目地反转一个字符串。

这里与static函数的一个例子:

class StringReverseTest 
{ 
    static void reverse(final String str) 
    { 
     char[] arr = str.toCharArray(); 
     final int len = arr.length; 

     for (int i = 0, j = len - 1 ; i < len/2 ; i++, j--) 
     { 
      final char temp = arr[ i ]; 
      arr[ i ] = arr[ j ]; 
      arr[ j ] = temp; 
     } 

     System.out.println(new String(arr).toString()); 
    } 

    public static void main (String[] args) 
    { 
     final String str1 = "My name is abc"; 
     reverse(str1); 

     final String str2 = "This is a string reverse test!"; 
     reverse(str2); 
    } 
} 

输出:

CBA SI埃曼y M的
TSET esrever gnirts一个SI SIHT

这里“ S中的活生生的例子:http://ideone.com/f6ut7f

1

你可能只是这样做

String s = "My name is abc"; 
    StringBuffer sb = new StringBuffer(s); 
    sb.reverse(); 
    System.out.println(sb.toString()); 

输出:CBA si eman yM

+0

很可能,这是作业。那么这样的“弯路”对此将无济于事。 – GhostCat

+0

哈哈,他们需要在他们的教室里接受一些惩罚来首先使用单个函数而不是算法,他们不会再发布这样的问题。 – abstractnature

0

刚落,那些不需要的条件,并使其simple

class Ideone { 
    public static void main(String[] args) { 
    String str = "My name is abc"; 
    System.out.println(str); // My name is abc 
    String rev = ""; 
    for (int i = str.length() - 1; 0 <= i; i--) { 
     rev += str.charAt(i); 
    } 
    System.out.println(rev); // cba si eman yM 
    } 
}