【问题标题】:Reverse characters in a sentence反转句子中的字符
【发布时间】:2013-01-29 11:56:22
【问题描述】:

我试图在不使用 split 功能的情况下反转句子中的字符。我真的很接近,但我错过了最后一封信。有人可以指出我正确的方向吗?现在它将“This is a new sentence”打印为“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();
}

【问题讨论】:

  • 在这种情况下,可以帮助写下句子并在纸上手写运行程序。
  • 我不明白 if-else 部分。重复代码太多。
  • 您的预期结果是什么:整个字符串的反转或每个单独单词的反转?对于第二种情况,也许您可​​以使用 StringTokenizer,或者在 currentPosition 和 nextBlankSpace 之间创建子字符串并反转它们

标签: java string char


【解决方案1】:

另一种选择

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

【讨论】:

  • 问题似乎只想颠倒每个单词中的字符,而不是颠倒句子中单词的顺序。
  • 是的,看了两遍我认为你可能是对的@Kailua Bum,我很困惑,因为我没有意识到在“sihT si a wen cnetnes”中有一个“e”错过了完成“句子”的反面(我认为每个单词的反面都是正确的),所以我认为他得到了每个单词的反面,但他想要完整字符串的反面。
  • 是的,问题似乎在于打印最后一个字符
【解决方案2】:
  • start 表示 wordStart。当 i 指向空格时,下一个 wordStart 应该指向 i 之后。
  • 因此最后一个i应该指向最后一个字符char之后,应该是length()
  • if-then-else 过于宽泛;在一种情况下必须添加空格:i 指向空格。

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

【讨论】:

    【解决方案3】:

    i <= sentence.length()
    

    在你的 for 循环中,将 if 更改为:

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

    作为

    substring(start,i)
    

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

    【讨论】:

    • i
    • @DiarmuidCampion i
    【解决方案4】:

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

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

    那么if应该是:

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

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

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

    第一个空格的问题也是子字符串的问题,假设您正在阅读“这是...”第一次它将使用start=0i = 4 进行子字符串,所以您期望“这个”但它确实是“这个”。下一个读数,start=4i=7 将是“是”。

    因此,随着索引的更改,您应该也可以使用start==0 删除 if/else。

    【讨论】:

    • 谢谢,效果很好。这个叫“i==0?0:i-1”的术语是什么,只是想了解一下。
    • 不客气!那是 Java 内联条件或三元运算符 (en.wikipedia.org/wiki/%3F:#Java)。意思是:当i为0时,返回0,否则返回i-1。它避免在第一次运行时搜索 charAt(-1)。
    【解决方案5】:
    String reverseString = "This is a new sentence";
    System.out.println(new StringBuffer(reverseString).reverse().toString());
    
    Syso prints : ecnetnes wen a si sihT
    

    【讨论】:

      【解决方案6】:
      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());
          }
      }
      

      看不到分裂。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-17
        • 2011-05-14
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-21
        相关资源
        最近更新 更多