我被指派完成回文计划。但是,我不能使用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)
答案 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个字符的输入;所有更长的输入)。您可以通过各种技巧逐一挑选输入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步。
此代码留作练习,因为它是作业。