【问题标题】:Java Poem Palindrome Checker: Iterate through array matching elements in orderJava Poem Palindrome Checker:按顺序遍历数组匹配元素
【发布时间】:2018-09-16 22:27:43
【问题描述】:

目前正在尝试编写一个诗歌回文检查器。这不是专门针对回文的,而是数组在两种方式中都有相同顺序的单词。比如下面是一首回文诗

Life-
imitates nature,
always moving, traveling continuously.
Continuously traveling, moving always,
nature imitates
life

我的问题是遍历数组以匹配第一个和最后一个元素,因为目前它以错误的顺序比较事物。

我的代码如下:

import java.util.Scanner;
import java.io.*;
public class WordPalindromeTest {

    public static void main(String[] args) {
        System.out.println("This program determines if an entered sentence/word poem is a palindrome.");
        Scanner input = new Scanner(System.in);
        System.out.println("Please enter a string to determine if it is a palindrome: ");
        while(input.hasNextLine()) {
            String palin = input.nextLine();
            if(palin.equals("quit")) {
                break;
            }
            else {
                boolean isPalin = isWordPalindrome(palin);
                if(isPalin == true) {
                    System.out.println(palin + " is a palindrome!");
                    }
                    else
                        System.out.println(palin + " is NOT  a palindrome!");
                }
            }

        System.out.println("Goodbye!");
        input.close();

    }

    public static boolean isWordPalindrome(String s) {
        boolean isWordPal = false;
        String lowerCase = s.toLowerCase();
        String replaced = lowerCase.replaceAll("[^a-zA-Z0-9\\s]", "");
        String words[] = replaced.split(" ");
        for(int i = 0; i < words.length; i++) {
            for(int j = 0; j < words.length; j++) {
                if (words[i].equals(words[j]) && i != j) {
                    isWordPal = true;
                }
                else
                    isWordPal = false;
            }
        }
        return isWordPal;
    }
}

具体问题是

public static boolean isWordPalindrome(String s) {
        boolean isWordPal = false;
        String lowerCase = s.toLowerCase();
        String replaced = lowerCase.replaceAll("[^a-zA-Z0-9\\s]", "");
        String words[] = replaced.split(" ");
        for(int i = 0; i < words.length; i++) {
            for(int j = 0; j < words.length; j++) {
                if (words[i].equals(words[j]) && i != j) {
                    isWordPal = true;
                }
                else
                    isWordPal = false;
            }
        }
        return isWordPal;
    }

我对如何正确设置循环来比较正确的元素感到困惑。它应该将第一个元素与最后一个元素进行比较,将第二个元素与倒数第二个元素进行比较,等等,直到循环完成。我意识到在继续之前我已经将第一个数组与整个数组进行了比较。

【问题讨论】:

  • 你的代码最大的错误是没有cmets。你应该先用英文写你的算法,用 cmets。然后你应该把它翻译成代码。保留 cmets。代码应该记录在案,要么通过编写方式自我记录(很少有编码人员具备),要么在 cmets 中进行解释。就像你可以在充满错误答案的考试中获得 90% 的部分一样,如果你展示了工作原理。你是这项运动的新手,可能还没有用代码思考。复杂的算法应该始终用您思考的语言编写,然后翻译成您正在学习的语言。

标签: java arrays loops palindrome


【解决方案1】:

这似乎是一个家庭作业,所以我不会给你一个可行的解决方案。但它是这样的:

-你不需要两个循环。你只需要比较第一个和最后一个,第二个和倒数第二个等。(提示:如果你从Array的长度中减去i-1,你会得到i的对应元素你需要比较)。此外,您只需要遍历Array 长度的一半以上

-如果isWordPal 变为假,您需要return 假。否则它可能会被覆盖,最后它会返回 true。

【讨论】:

  • 另一个技巧,你只需要运行一个循环来迭代数组长度的一半
  • @CaiusJard 是的。我编辑了。感谢您的建议!
  • 我认为使用两个循环是不正确的。减法是在循环声明期间进行,还是在之后的 if 语句中进行? for(int i = 0; i &lt; words.length-1; i++ 或说if(words[i].equals(words[words.length-(i-1)) 感谢您的帮助!
  • @gblodgett Ps 如果有人因为这个答案给你打分,请不要感到惊讶,因为在纯粹的“为他们做功课”的意义上,这不是一个答案。我支持你对自己的鼓励思考和学习,顺便说一句,但在某些时候肯定会有一些抱怨的纯粹主义者.. :)
  • @GBlodgett 感谢您的帮助!弄清楚了。做了一个 if 语句检查,并修复了我的 return 语句。 if(words[i] != words[words.length -1 -i]){ return false; } 。花了我一点时间,因为我不小心把单词拼成了单词……再次感谢您!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多