Java 回文法逻辑错误
我正在编写一个方法,当传递一个字符串时,如果它是回文,则返回'true',如果它不是回文,则返回'false'。该方法在返回回文时忽略任何标点符号和空格。当我试图传递字符串“Hannah”时,它返回falseJava 回文法逻辑错误,java,Java,我正在编写一个方法,当传递一个字符串时,如果它是回文,则返回'true',如果它不是回文,则返回'false'。该方法在返回回文时忽略任何标点符号和空格。当我试图传递字符串“Hannah”时,它返回false public static boolean isPalindrome(String p){ String backwardsOriginal = ""; String blank = ""; for(int i =0; i< p.length();i++){ S
public static boolean isPalindrome(String p){
String backwardsOriginal = "";
String blank = "";
for(int i =0; i< p.length();i++){
String lookAt = p.substring(i,i+1).toLowerCase();
if ((!lookAt.equals(" ")) || (!lookAt.equals(",")) || (!lookAt.equals(".")) || (!lookAt.equals("!")) ||(!lookAt.equals("?"))) {
blank+=lookAt.toLowerCase();
}
}
for(int j=blank.length();j>=0;j--){
if(j==0)
backwardsOriginal +=blank.substring(0,j+1).toLowerCase();
else
backwardsOriginal += blank.substring(j-1,j).toLowerCase();
}
boolean k = true;
int first = 0;
int last = blank.length()-1;
int ct = 0;
while(k && (ct != blank.length())){
if (last == 0) {
if (blank.substring(blank.length()-1) != backwardsOriginal.substring(0,blank.length())) {
k=false;
}
} else if (last > 0) {
if(blank.substring(first, first+1).equals(backwardsOriginal.substring(last-1,last))) {
k=true;
first++;
last--;
} else {
k=false;
}
}
}
return k;
}
public静态布尔值isAlindrome(字符串p){
字符串backwardsOriginal=“”;
字符串空白=”;
对于(int i=0;i=0;j--){
如果(j==0)
backwardsOriginal+=blank.substring(0,j+1).toLowerCase();
其他的
backwardsOriginal+=blank.substring(j-1,j.toLowerCase();
}
布尔k=真;
int first=0;
int last=blank.length()-1;
int-ct=0;
而(k&(ct!=blank.length()){
如果(最后==0){
if(blank.substring(blank.length()-1)!=backwardsOriginal.substring(0,blank.length())){
k=假;
}
}否则如果(最后一次>0){
if(blank.substring(first,first+1).equals(backwardsOriginal.substring(last-1,last))){
k=真;
第一++;
最后--;
}否则{
k=假;
}
}
}
返回k;
}
我将从一个正则表达式开始,将所有内容转换为非单词字符(这是一个特殊的类regex\W
,单词是\W
——在Java中,我们必须为模式转义\
)。然后,我将小写并将结果转换为char[]
。然后,您只需迭代数组长度的一半-如果任何字符不在正确的位置返回false
-如果到达末尾,它就是回文。像
public static boolean isPalindrome(String p) {
char[] arr = p.replaceAll("\\W", "").toLowerCase().toCharArray();
int len = arr.length;
for (int i = 0; i < len / 2; i++) {
if (arr[i] != arr[len - i - 1]) {
return false;
}
}
return true;
}
public static boolean isPalindrome(String p) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < p.length(); i++) {
char ch = Character.toLowerCase(p.charAt(i));
if (Character.isLetter(ch)) {
sb.append(ch);
}
}
int len = sb.length();
for (int i = 0; i < len / 2; i++) {
if (sb.charAt(i) != sb.charAt(len - i - 1)) {
return false;
}
}
return true;
}
(这是真的
)。并且,根据您在注释中更新的限制,您可以使用StringBuilder
实现相同的算法(但是您需要两个循环,一个用于构建“正确的”字符串
,另一个用于测试它是否是回文)。像
public静态布尔值isAlindrome(字符串p){
StringBuilder sb=新的StringBuilder();
对于(int i=0;i
建议,使用replaceAll
替换所有,
?
使用空字符串,然后在字母上迭代,这将使程序更容易。抱歉,我忘了提到我不允许使用数组、replace、replaceAll或replaceFirst。
public static boolean isPalindrome(String p) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < p.length(); i++) {
char ch = Character.toLowerCase(p.charAt(i));
if (Character.isLetter(ch)) {
sb.append(ch);
}
}
int len = sb.length();
for (int i = 0; i < len / 2; i++) {
if (sb.charAt(i) != sb.charAt(len - i - 1)) {
return false;
}
}
return true;
}