Java-回文计划

时间:2015-01-23 17:58:39

标签: java

我被指派完成回文计划。但是,我不能使用charAt方法。

通常,我能够相当快地解决这个问题。但是,因为我不能使用charAt,所以我不知道该怎么做才能做到这一点。

我的想法是取字符串的长度,除以2(但这限制了我只使用偶数个字符串的字符串)然后将子字符串转换为int' s然后最后比较两个int& #39; S

这是我到目前为止的代码 -

public static boolean isPal(String s)
{
    int length = s.length();
    int math = length / 2;
    String side1 = s.substring(1,math);
    String side2 = s.substring(math, length);

    int s1 = Integer.parseInt(side1);
    int s2 = Integer.parseInt(side2);

    if(s1 == s2){
        return true;
    } else {
        return false;
    }
}

但是,我已经意识到这可能不是,也可能不是处理这种情况的最佳方法。我目前遇到此错误 -

Exception in thread "main" java.lang.NumberFormatException: For input string: "i"
at java.lang.NumberFormatException.forInputString(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at java.lang.Integer.parseInt(Unknown Source)
at Palindrome.isPal(Lab08st.java:47)
at Lab08st.main(Lab08st.java:20)

我相信这是因为我需要一个for循环。 但是,由于Java经验不足,我不确定。

我愿意接受任何建议。 (只要他们不需要charAt)

3 个答案:

答案 0 :(得分:0)

使用此:

public static boolean isPal(String s) {
    char[] chars = s.toCharArray();
    int len = chars.length;

    for (int i = 0; i < len ; i++) {
        if(chars[i] != chars[len-i-1] ){
            return false;
        }
    }
    return true;
 }

答案 1 :(得分:0)

您的方法在几个方面存在缺陷:

  • Integer.parseInt(String)仅适用于表示可表示为int类型的基数为10的数字字符串。你的函数在非数字输入上完全失败,在输入上太大而不能将一半表示为int s(一些19-20个字符的输入;所有更长的输入)。
  • 对于具有奇数个字符的任何输入,您的函数将失败,因为您无法将这些输入均匀地分成两半。
  • 无论如何,你的逻辑是有缺陷的。它会判断“1010”是一个回文(它不是),它会判断“1001”不是回文(尽管它是一个)。

您可以通过各种技巧逐一挑选输入String的字符,其中包括:

  • 您可以通过char[]获取String.toCharArray()中的字符,与其他地方一样。
  • 您可以通过一系列substring()调用来使用输入。
  • 您可以使用StringCharacterIterator来迭代字符

由于不清楚为什么不允许您使用charAt(),因此这里的方法完全避免依赖索引:

import java.text.StringCharacterIterator;

// ...

public static boolean isPal(String s)
{
    StringCharacterIterator it = new StringCharacterIterator(s);
    String reversed = ""

    for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
        reversed = c + reversed;
    }

    return reversed.equals(s);
}

有更有效的方法,但那个方法清晰简单。

或者这是一个不依赖(显式)在String以外的任何类上的,但确实使用索引0和1:

public static boolean isPal(String s)
{
    String tail = s;
    String reversed = ""

    while (tail.length() > 0) {
        reversed = tail.substring(0, 1) + reversed;
        tail = tail.substring(1);
    }

    return reversed.equals(s);
}

或者既然你有想法将String分成两部分,也许这是由你的导师指导的?你是在研究递归吗?因为你也可以通过递归算法反转输入字符串:(1)将字符串分成两部分(尽可能均匀地工作); (2)递归反转每一半; (3)将相反的一半以相反的顺序重新组合在一起。 (实施留作练习。)

尽管如此,请注意,如果满足要求,Reticality使用StringBuilder.reverse()的单行程在所有方面都会更好。

答案 2 :(得分:-1)

如果你要检查一个作为字符串给出的数字是否是回文,那么你可以用数学来做。使用将最低有效数字与最高有效数字进行比较的算法,然后将其删除为数字并继续。如果有奇数个数字,那么您不需要将该中间数字与任何数字进行比较 - 您只需要数字/ 2步。

此代码留作练习,因为它是作业。