检查多个载体是否是回文?

时间:2014-01-10 06:01:51

标签: java vector stack queue

我创建了一个从文件中读取String的程序,并检查它是否是回文。现在我需要改变它以检查载体是否是回文。我必须创建几个向量并检查它们是否是回文。说我有以下的载体

(1,2,3), (1,1,1), (2,2,2), (2,2,2), (1,1,1), (1,2,3)

程序将使用两个迭代器,并检查第一个是否等于最后一个,如果第二个等于倒数第二个,依此类推。这是我String输入的程序:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Stack;
import java.util.Vector;

public class Project4
{
    public static void main(String[] args) throws IOException
    {
        Vector v1 = new Vector(3);
        Vector v2 = new Vector(3);
        Vector v3 = new Vector(3);
        Vector v4 = new Vector(3);
        ArrayList vectors = new ArrayList();
        v1.add(1);
        v1.add(2);
        v1.add(3);
        v2.add(1);
        v2.add(1);
        v2.add(1);
        v3.add(1);
        v3.add(1);
        v3.add(1);
        v4.add(1);
        v4.add(2);
        v4.add(3);
        vectors.add(v1);
        vectors.add(v2);
        vectors.add(v3);
        vectors.add(v4);
        if (isPalindrome(vectors))// If true, it's a palindrome
            System.out.println("That is a palindrome.");
        else // otherwise, it's not
            System.out.println("That is not a palindrome.");

    }
    public static boolean isPalindrome(ArrayList vectors)
    {
        // Make a new queue, stack, and character object
        Queue<Vector> q = new LinkedList<>();
        Stack<Vector> s = new Stack<>();
        for(int i = 0; i < vectors.size(); i++){
            q.add((Vector) vectors.get(i));
            s.add((Vector) vectors.get(i));
        }
        Vector temp = new Vector();
        int mismatches = 0;
        for (int i = 0; i < vectors.size(); i++)
        {
            temp = (Vector) vectors.get(i);
            if (vectors.get(i).equals(vectors.get(i)))
            {
                q.add(temp);
                s.push(temp);
            }
        }

        while (!q.isEmpty())
        {
            if (q.remove() != s.pop())
                mismatches++; // Increment "mismatches" if q != s
        }

        return (mismatches == 0); // will return true if the method did not change the variable "mismatches"
    }
}

2 个答案:

答案 0 :(得分:1)

尝试以下(非常简单)。阅读代码中的注释,了解其工作原理。

<强>代码:

public static void main(String[] args)
{
    int[] a = { 1, 2, 3 };
    int[] b = { 1, 2, 1 };
    int[] c = { 1, 2, 2, 1 };
    int[] d = { 1, 2, 3, 1 };
    int[] e = { 1 };
    System.out.println(is_palindrome(a));
    System.out.println(is_palindrome(b));
    System.out.println(is_palindrome(c));
    System.out.println(is_palindrome(d));
    System.out.println(is_palindrome(e));

}

public static boolean is_palindrome(int[] arr)
{
    for (int i = 0; i < arr.length / 2; i++) { // Check just half times the size of 'arr'
        // System.out.println(arr[i] + " - " + arr[arr.length - i - 1]); // Debug
        if (arr[i] != arr[arr.length - i - 1]) // Check 'first' with 'last', 'second' with 'last - 1' ...
            return false;
    }
    return true;
}

<强>输出:

false
true
true
false
true

答案 1 :(得分:0)

我认为你要确定的是整数的整数列表是否是回文。通过展平,我的意思是,如果你展平[(3, 2, 1), (1, 2, 1), (1, 2, 3)],它将变为[3, 2, 1, 1, 2, 1, 1, 2, 3](你可以看到它是一个回文)。

您的代码遇到了一些问题。举个例子,为什么要检查vectors.get(i).equals(vectors.get(i))?这将始终评估为真。

这个问题有点儿作业,所以我不打算给你一个实现,但我会概述一个。

isPalindrome(ArrayList vectors)

  1. vectors的前半部分推到堆栈上。
  2. vectors的后半部分排入队列,反向
  3. 比较x = q.remove()y = s.pop(),直到您没有更多元素。如果你考虑一下,扁平列表可以成为回文的唯一方法是xy,它们只是整数列表,是相反的。
  4. 你可以从那里拿走它。我可以通过几种方式来实现这一点,特别是第3步。