4

我试图在不使用拆分功能的情况下反转句子中的字符。我真的很接近,但我错过了最后一封信。有人可以指出我正确的方向吗?现在它打印“这是一个新句子”为“sihT si a wen cnetnes”我还包括if(start == 0)因为程序会跳过初始空格字符,但我不明白为什么?

static String reverseLetters(String sentence)
    StringBuilder reversed = new StringBuilder("");
        int counter = 0;
        int start = 0;
        String word;

        for(int i = 0; i <= sentence.length()-1 ; i++ )
        {
            if(sentence.charAt(i)== ' '|| i == sentence.length()-1 )
            {
                StringBuilder sb = new StringBuilder("");
                sb.append(sentence.substring(start,i));
                if(start == 0)
                {
                start = i;
                word = sb.toString();
                reversed.append(reverseChar(word));
                reversed.append(' ');
                }
                else
                {
                    start = i;
                    word = sb.toString();
                    reversed.append(reverseChar(word));
                }
            }


  return reversed.toString();
        }

static String reverseChar (String word)
{
    StringBuilder b = new StringBuilder("");
    for(int idx = word.length()-1; idx >= 0; idx -- )
    {
        b.append(word.charAt(idx));
    }
    return b.toString();
}
4

6 回答 6

4
  • start意味着wordStart。当 i 指向空格时,下一个 wordStart 应该指向 i 之后。
  • 因此最后一个i应该指向最后一个单词char之后,应该是length()
  • if-then-else 太宽泛了;在一种情况下必须添加空格: i 指向空格。

可以无条件循环,并且 i == length() 在循环代码中间中断。

于 2013-02-13T20:11:14.667 回答
3

另外一个选项

private String reverse (String originalString) {
    StringBuilder reverseString = new StringBuilder();
    for (int i = originalString.length() - 1; i >= 0; i--) {
        reverseString.append(originalString.charAt(i));
    }
    return reverseString.toString();
}
于 2013-02-13T20:07:44.313 回答
3

我认为错误在于索引,for应该是

 for(int i = 0; i <= sentence.length() ; i++ )

那么if应该是:

if (sentence.charAt(i==0?0:i-1)== ' '|| i == sentence.length() )

对我来说,错误是substring(start,i)最后一个i应该是 sentence.length 而不是 sentence.length-1,所以这可以解决它。

子字符串在最后一个索引中是打开的,所以如果你放的substring(1, 10)是从 1 到 9 的子字符串。这可能是最后一个单词的问题。

第一个空格的问题也是子字符串的问题,假设您正在阅读“this is...”,它会第一次进行子字符串处理start=0i = 4因此您期望“this”,但它确实是“this”。下一个读法,withstart=4i=7will 是“is”。

因此,随着索引的更改,您也应该能够删除 if/else start==0

于 2013-02-13T20:24:33.733 回答
3
String reverseString = "This is a new sentence";
System.out.println(new StringBuffer(reverseString).reverse().toString());

Syso prints : ecnetnes wen a si sihT
于 2013-02-13T20:25:56.573 回答
1

i <= sentence.length()

在您的 for 循环中并将 if 更改为:

if(i == sentence.length() || sentence.charAt(i)== ' ')

作为

substring(start,i)

返回直到 i 的字符串,不包括在内。

于 2013-02-13T20:14:27.773 回答
1
import java.util.Stack;

public class Class {
    public static void main(String[] args) {
        String input = "This is a sentence";
        char[] charinput = input.toCharArray();
        Stack<String> stack = new Stack<String>();
        for (int i = input.length() - 1; i >= 0; i--) {
            stack.push(String.valueOf(charinput[i]));
        }
        StringBuilder StackPush = new StringBuilder();
        for (int i = 0; i < stack.size(); i++) {
            StackPush.append(stack.get(i));
        }
        System.out.println(StackPush.toString());
    }
}

看不出分裂。

于 2013-02-13T20:37:45.840 回答