【问题标题】:JAVA: Error reversing a string to check for palaindrome off-by-one i thinkJAVA:我认为错误反转字符串以检查 palaindrome off-by-one
【发布时间】:2015-08-26 13:54:28
【问题描述】:

我遇到了问题。我收到了一个为回文检查程序编写伪代码的任务。我的问题是,虽然我在伪代码作业上获得了不错的成绩,但当我尝试用 java 编写代码以供自己启迪时,我无法让一个能够检查intstring 的代码。

import java.util.Scanner;
public class palindromeCheck {

private static Scanner in;

public static void main(String[] args) {

    in = new Scanner(System.in);
    String forward;
    String reverse = "";
    int reverseCountdown;
    System.out.println("enter a string and I will tell you if its a palindrome");
    forward= in.next();
    int stringLength= forward.length();


    for(reverseCountdown = stringLength-1; stringLength>-1; stringLength--);
    reverse=reverse+forward.charAt(reverseCountdown);

    if(forward.equals(reverse))
        System.out.println("Bro you got a palindrome!");
    else
        System.out.println("Thats not a palindrome...");

    }
 }

现在,就我可怜的技能而言,我的问题是,在我的for 循环中,我正在将字符值一个一个地转录到一个字符串中,但是,我想不出一个代码将采用所有字符的解决方案;除了一个,它似乎把它们都拿走了。 (或者也许我的错误是别的东西。)但这就是代码运行时的样子,但我从来没有得到回文的响应(即使是像222这样明显的东西),除了像单字符项目0 或 1。

任何帮助解决此问题或了解更优雅的检查方式将不胜感激。

【问题讨论】:

    标签: java for-loop palindrome charat off-by-one


    【解决方案1】:

    for 循环应该是这样的

        for (reverseCountdown = stringLength-1; reverseCountdown >=0; reverseCountdown--){ //have changed the loop variables here
                    reverse  += forward.charAt(reverseCountdown);
        }
    

    for 循环末尾的 ; 导致 for 循环在空语句上运行(仅 ; 被视为空语句)。删除它并稍微改变你的 for 循环,

    你的 for 循环的问题是,你应该在任何地方都使用变量“reverseCountdown”,但你正在做StringLength--,这并不好。

    使用 StringBuilder 也是一种方式,它具有反转字符串的内置功能,但我不确定给你分配的人是否会很高兴看到你使用内置功能。

    希望这会有所帮助! 祝你好运!

    【讨论】:

    • 感谢这个更正使它适用于像“212”或“转子”这样的值,但是空间仍然把它扔掉,所以“212 212”或“赛车”仍然是假的。有没有我可以纠正的方法。我们是否需要您和其他人列出的 StringBuilder 或数组方法来提供该功能?
    • "race car" 不是回文,需要尊重空格,一般单字考虑回文,如果还想做的话,可以考虑去掉空格和然后检查
    • 非常感谢。我会认为这是成功的。我想如果他们想要一个短语而不是一个单词或数字,我可以要求他们输入不带空格的短语。我会研究一下 StringBuilder 的功能,听起来这可以让我在未来避免一些头痛。
    【解决方案2】:

    for 循环以分号结束。

    for(reverseCountdown = stringLength-1; stringLength>-1; stringLength--);
    reverse=reverse+forward.charAt(reverseCountdown);
    

    我相信你想要(并且你需要测试和修改reverseCountdown)类似的东西

    for(reverseCountdown = stringLength-1; reverseCountdown>-1; reverseCountdown--) {
       reverse=reverse+forward.charAt(reverseCountdown);
    }
    

    我个人更喜欢StringBuilder(因为它有reverse 方法)之类的

    System.out.println("enter a string and I will tell you if "
            + "it's a palindrome");
    String forward = in.next();
    StringBuilder sb = new StringBuilder(forward);
    sb.reverse();
    if (sb.toString().equals(forward)) {
        System.out.println("Bro you got a palindrome!");
    } else {
        System.out.println("Thats not a palindrome...");
    }
    

    【讨论】:

    • 你不认为问题循环变量不正确,stringLength-- 不会达到目的
    • @Vihar Nice。还有测试。谢谢。
    【解决方案3】:

    我认为更好的方法是在 java 中使用 StringBuilder 或使用 array 自己实现,如下所示。

    import java.util.Scanner;
    
    
    public class PalindromeCheck {
    
    private static Scanner in; 
    
    public static void main(String[] args) {
    
        in = new Scanner(System.in);
        System.out.println("enter a string and I will tell you if its a palindrome");
        char[] arr = in.next().toCharArray();
        boolean bool = true;
        for(int i=0;i<Math.floor(arr.length/2);i++){
            if(arr[i] != arr[arr.length-1-i]){
                System.out.println("Not a palindrome");
                bool = false;
                break;
            }
        }
        if(bool){
            System.out.println("You got a palindrome");
        }
    }
    }
    

    这样会更有效率,因为它只循环了一半的时间。

    【讨论】:

    • 谢谢你,我将谷歌如何使用我以前没有使用过的数组系统,编码新手。乍一看,这似乎是更严格的数学方法。
    • 当然......这就像“我们有两个指针 - 一个从开始,另一个从结束,我们正在比较它们指向的字符,然后以相同的方式前进,除非我们得到不匹配(在这种情况下它将立即停止)或者两个指针在中心相遇,这意味着它是一个回文。所以,如果给定的单词是“Ouney”,那么它将比较“O”和“y”并且会失败(只有一次迭代)但是在您的版本中,每个单词都会循环相同的次数。
    【解决方案4】:

    检查回文码

    public class PalindromeCheck {
    
        public static boolean check(String str) {
            boolean flag = true;
            char[] chs = str.toCharArray();
            int len = chs.length;
            for(int i = 0; i < len/2; i++) {
                if(chs[i] != chs[len - i -1]) {
                    flag = false;
                    break;
                }
            }
            return flag;
        }
    
        public static void main(String[] args) {
            String str0 = "123321";
            String str1 = "1234321";
            String str2 = "123421";
            System.out.println(check(str0));
            System.out.println(check(str1));
            System.out.println(check(str2));
        }
    }
    

    【讨论】:

      【解决方案5】:

      这不是伪代码吧?为什么你的 for 循环后面有一个分号?

      我会删除它。

      这不是唯一的问题。你应该使用你的 reverseCountdown 作为循环检查而不是 stringLength,你应该减少 reverseCountdown。

      for(reverseCountdown = stringLength-1; reverseCountdown >= 0; reverseCountdown--)
      

      【讨论】:

      • 不,这是我在完成作业后制作的 Java,试图进行一些练习,这只是困扰我,我无法让它工作。我删除了分号,但它仍然将“212”标记为不是回文。所以我想我犯了一些对我来说仍然隐藏的错误。
      猜你喜欢
      • 2012-05-10
      • 2012-11-23
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多