【问题标题】:Trying to invert the characters in a sentence试图颠倒句子中的字符
【发布时间】:2022-01-02 02:53:27
【问题描述】:
    Scanner input = new Scanner(System.in);
    String sentence , invertedsentence = "";
    int total , x;
    
    System.out.print("Enter your sentence:");
    sentence = input.nextLine();
    
    total = sentence.length();

我正在尝试反转输入中的字符

    for ( x = total-1 ; x < 1 ; x--){
        invertedsentence = invertedsentence + sentence.charAt(x);
    }
    

输出显示空白

    System.out.println(invertedsentence);

【问题讨论】:

  • 为什么?既然我需要反转字符串,那么它应该是从最后一个位置访问到第一个位置,不是吗?
  • for 中间的条件是while 条件,而不是until 条件。所以Janez Kuhar 是对的
  • 哦,我明白了。谢谢!
  • @CopperCleric 作为旁注,习惯于在不再需要资源时关闭它们。您的扫描仪对象应该关闭。这适用于所有 I/O 资源。这是您在开始为实际应用程序编码之前应该学习的重要一课。

标签: java loops


【解决方案1】:

应该是x&gt;=0

for (int x = total-1 ; x >= 0 ; x--){
    invertedsentence = invertedsentence + sentence.charAt(x);
}

【讨论】:

    【解决方案2】:

    你试过了吗:

    new StringBuilder(input).reverse().toString();
    

    所以它变得不那么复杂了?

    如果你试图解决一个问题,你的 for 循环是错误的。第一个 "x = 0 因为你需要转到最后一个索引:

    for ( x = total-1 ; x >= 0 ; x--)
    

    完整示例:

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        String sentence = "";
        int total , x;
    
        System.out.print("Enter your sentence:");
        sentence = input.nextLine();
        total = sentence.length();
    
        String invertedsentence = "";
    
        for ( x = total-1 ; x >= 0 ; x--){
            invertedsentence += (Character.toString(sentence.charAt(x)) + "");
        }
    
        System.out.println(invertedsentence);
    }
    

    【讨论】:

    • 这显然是一个功课。虽然反转字符串缓冲区有效,但这不是功课所追求的。
    【解决方案3】:

    逻辑错了。应该是

    for ( x = total-1 ; x >= 0 ; x--){ 
        invertedsentence = invertedsentence + sentence.charAt(x);
    }
    

    另外,建议使用 StringBuilder/StringBuffer(这是一个线程安全的实现)而不是直接连接字符串,因为每次连接字符串时,都会创建字符串的新副本并引用可能非常糟糕的内容特别是如果您要反转的字符串很大,即使用以下内容:

    Scanner input = new Scanner(System.in);
    String sentence;
    StringBuilder invertedsentence = new StringBuilder();
    int total , x;
    
    System.out.print("Enter your sentence:");
    sentence = input.nextLine();
    
    total = sentence.length();
    for ( x = total-1 ; x >= 0 ; x--){
        invertedsentence.append(sentence.charAt(x));
    }
    System.out.println(invertedsentence.toString());
    

    【讨论】:

    • 如果您不打算利用reverse(),为什么还要创建一个字符串生成器?你可以对数组做同样的事情。由于这显然是一项家庭作业,因此他们没有学习 StringBuilder。我很确定。
    • 是的,我们可以使用 reverse() 但学习概念很重要,我只想强调他的逻辑是错误的,正如你所说,他们现在可能不会学习 StringBuilder :)
    • 好的,谢谢!
    【解决方案4】:

    我假设这是一个家庭作业,你的教授有兴趣教你如何操作数组。

    String 对象由字符数组支持。因此,您需要颠倒数组中元素的顺序。剧透警告:您可以通过调用 StringBuilder#reverse() 方法轻松完成此操作,但这不是作业要求您执行的操作。

    有两种解决方案适合您的作业。一个是创建一个新数组,其中原始数组中的最后一个字符放置在新数组的第一个索引中。因此,您将需要一个从字符串长度 - 1 到零的循环,以便您可以将指针移动到原始数组的字符上。

    第二种解决方案是就地执行。为此,您将交换第一个和最后一个元素,并将两个指针从数组的末端向内移向中间。您将需要一个临时的char 变量来保存其中一个值以完成交换。在这种情况下,您将增加左指针(头)并减少右指针(尾),直到它们重叠(当左指针的值大于或等于右指针时)。

    我不会编写代码,因为这是一个家庭作业,你需要自己解决这个问题。但这对您来说已经足够了。

    更新:我改变了主意。以下是我上面描述的解决方案。

    public class ReversedString {
    
        public static void main(String[] args) {
            Scanner scanner = new Scanner(System.in);
            System.out.print("Enter a word or sentence: ");
            String str = scanner.nextLine(); // i.e. Hello World!
            scanner.close();
            
            // in-place solution
            int headPtr = 0;
            int tailPtr = str.length() - 1;
            char temp;
            char[] arr = str.toCharArray();
            while (headPtr <= tailPtr) {
    
                temp = str.charAt(headPtr);
                arr[headPtr] = str.charAt(tailPtr);
                arr[tailPtr] = temp;
                headPtr++;
                tailPtr--;
            }
            
            String reversedString = new String(arr);
            System.out.println("Reversed String: " + reversedString); // !dlroW olleH
            
            
            // two-array solution
            char[] newArr = new char[arr.length];
            for (int i = arr.length - 1, j = 0; i >= 0; i--, j++) {
                newArr[j] = arr[i];
            }
            
            reversedString = new String(newArr);
            System.out.println("Reversed String: " + reversedString); // Hello World!
        }
    }
    

    显然,您只需要一个。虽然双数组解决方案看起来更简洁,并且在大多数情况下可能还可以,但如果您正在处理非常大的字符串,它可能不是最佳的,因为您使用了更多内存。就地解决方案解决了这个问题,因为所有数组操作都是在原始数组中完成的,方法是将其中一个字符移动到一个临时值,以便字符交换起作用。

    我相信这就是你的教授希望你能够完成的作业。

    【讨论】:

      猜你喜欢
      • 2016-04-21
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多