1. 题目
读题
考查点
2. 解法
思路
代码逻辑
具体实现
这道题目的解答思路是:
- 首先,定义两个字符串,分别存储加密和解密的规则,例如
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
和"BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza1234567890"
。 - 然后,对输入的字符串进行遍历,对每个字符进行查表操作,找到对应的加密或解密后的字符,并拼接到结果字符串中。
- 最后,输出结果字符串。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
String s1 = sc.nextLine();
String s2 = sc.nextLine();
System.out.println(encrypt(s1));
System.out.println(decrypt(s2));
}
sc.close();
}
// 加密
public static String encrypt(String s) {
String dic1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String dic2 = "BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza1234567890";
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
int index = dic1.indexOf(c);
if (index == -1) {
sb.append(c);
} else {
sb.append(dic2.charAt(index));
}
}
return sb.toString();
}
// 解密
public static String decrypt(String s) {
String dic1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
String dic2 = "BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza1234567890";
StringBuilder sb = new StringBuilder();
for (char c : s.toCharArray()) {
int index = dic2.indexOf(c);
if (index == -1) {
sb.append(c);
} else {
sb.append(dic1.charAt(index));
}
}
return sb.toString();
}
}
自有实现
public class HJ029 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println(encode(sc.nextLine()));
System.out.println(decode(sc.nextLine()));
}
public static String encode(String str) {
StringBuffer sb = new StringBuffer();
for (char c : str.toCharArray()) {
if (Character.isDigit(c)) {
if (c == '9') {
sb.append('0');
} else {
sb.append((char) (c + 1));
}
} else if (c >= 'a' && c <= 'z') {
if (c == 'z') {
sb.append('A');
} else {
sb.append(Character.toUpperCase((char) (c + 1)));
}
} else if (c >= 'A' && c <= 'Z') {
if (c == 'Z') {
sb.append('a');
} else {
sb.append(Character.toLowerCase((char) (c + 1)));
}
} else {
sb.append(c);
}
}
return sb.toString();
}
public static String decode(String str) {
StringBuffer sb = new StringBuffer();
for (char c : str.toCharArray()) {
if (Character.isDigit(c)) {
if (c == '0') {
sb.append('9');
} else {
sb.append((char) (c - 1));
}
} else if (c >= 'a' && c <= 'z') {
if (c == 'a') {
sb.append('Z');
} else {
sb.append(Character.toUpperCase((char) (c - 1)));
}
} else if (c >= 'A' && c <= 'Z') {
if (c == 'A') {
sb.append('z');
} else {
sb.append(Character.toLowerCase((char) (c - 1)));
}
} else {
sb.append(c);
}
}
return sb.toString();
}
}
3. 总结
Java中char类型加1的方法
Java中char类型是一个16位的Unicode字符,它可以表示0到65535之间的整数值。因此,对char类型的变量或常量进行加1操作,就相当于对它们的整数值进行加1操作,然后转换回char类型。
例如,如果有一个char变量c = 'a'
,那么c + 1
的结果就是'b'
,因为’a’的整数值是97,加1后是98,对应的字符是’b’。同理,如果有一个char常量'9'
,那么'9' + 1
的结果就是':'
,因为’9’的整数值是57,加1后是58,对应的字符是’:'。
Java中char类型加1的方法有以下几种:
- 直接使用加号运算符(+),例如
c + 1
或者'9' + 1
。 - 使用Character类的静态方法toChars(int codePoint),它可以根据一个Unicode码点返回一个char数组,例如
Character.toChars(c + 1)
或者Character.toChars('9' + 1)
。 - 使用强制类型转换(cast),将整数值转换为char类型,例如
(char)(c + 1)
或者(char)('9' + 1)
。
以上三种方法都可以实现char类型加1的功能,但是在使用时要注意以下几点:
- 如果char类型的值已经达到了最大值65535,那么再加1就会溢出,结果会变成0。例如,如果有一个char变量
c = '\uFFFF'
(\uFFFF表示65535),那么c + 1
的结果就是\u0000
(\u0000表示0)。 - 如果char类型的值不是一个有效的Unicode字符,那么加1后可能得到一个无法显示或者错误的字符。例如,如果有一个char变量
c = '\uD800'
(\uD800表示55296),那么c + 1
的结果就是\uD801
(\uD801表示55297)。但是这两个值都不是有效的Unicode字符,而是用来表示代理对(surrogate pair)的高位部分2。如果要正确地显示代理对,还需要另一个低位部分。因此,在对char类型进行加1操作时,要确保它们是有效的Unicode字符。 - 如果要对多个char类型进行加法运算,要注意运算顺序和优先级。例如,如果有两个char变量
c1 = 'a'
和c2 = 'b'
,那么表达式c1 + c2 + 1
和表达式(c1 + c2) + 1
的结果都是199,因为’a’和’b’的整数值分别是97和98,相加后再加1就是199。但是表达式(char)(c1 + c2) + 1
和表达式(char)(c1 + c2 + 1)
的结果就不同了。前者先将’a’和’b’相加得到195,然后转换为char类型得到’\u00C3’(\u00C