2024-11-16-蓝桥杯:回文判定

1.4k words

回文判定

问题与代码

思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
String S = scan.next(); // 从标准输入读取一个字符串
char[] c = S.toCharArray(); // 将字符串转换为字符数组
StringBuilder sb = new StringBuilder(); // 创建一个StringBuilder对象,用于构建字符串
double a = Math.pow(10, 6); // 定义一个变量a,值为10的6次方,但这里实际上用不上,因为字符串长度是int类型

// 检查字符串长度是否在1到10^6之间(虽然a是double类型,但这里只是形式上的检查,因为字符串长度不会超过Integer.MAX_VALUE)

for (int i = 0; i < c.length; i++) {
char str = c[i]; // 获取当前字符

// 检查字符是否为字母(ASCII码65-90为大写字母A-Z,97-122为小写字母a-z)
if (str >= 65 && str <= 90 || str >= 97 && str <= 122) {
// 这里开始出现问题:每次遇到字母时,都会重新遍历整个字符串并反转,这是不必要的
for (int i1 = c.length - 1; i1 >= 0; i1--) {
char str2 = c[i1]; // 获取反转后的字符
sb.append(str2); // 将字符添加到StringBuilder中
}
String str3 = sb.toString(); // 将StringBuilder转换为字符串

// 检查反转后的字符串是否与原字符串相同
if (str3.equals(S)) {
System.out.println("Y"); // 如果是,输出Y
} else {
System.out.println("N"); // 如果不是,输出N
}
break; // 一旦完成比较,就退出循环,这意味着只要第一个字符是字母,就会立即判断

} else {
System.out.println("N"); // 如果当前字符不是字母,直接输出N并退出循环
break;
}

// 注意:这里的逻辑存在问题,因为无论是否找到字母,都会立即退出循环,
// 这意味着代码只能检查字符串的第一个字符是否为字母以及它是否构成回文。
}
}
scan.close(); // 关闭Scanner对象
}
}

// 存在的问题和改进建议:
// 1. 不需要每次遇到字母都重新反转整个字符串,只需在循环结束后进行一次反转检查。
// 2. 可以先过滤掉非字母字符,再检查剩余部分是否为回文。
// 3. 变量a的声明和使用是多余的,因为字符串长度是int类型,不会超过Integer.MAX_VALUE。
// 4. 可以使用更高效的算法,如双指针法,来检查回文。