题解 | #字符串加解密# 【打表】
https://www.nowcoder.com/practice/2aa32b378a024755a3f251e75cbf233a
模拟
一开始,自己傻乎乎模拟....
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String line1 = in.nextLine();
String line2 = in.nextLine();
System.out.println(encrypt(line1));
System.out.println(decrypt(line2));
in.close();
}
// 加密
static StringBuilder encrypt(String s) {
StringBuilder res = new StringBuilder();
char c = ' ';
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i);
if (Character.isDigit(c)) {
res.append((char) ((c - '0' + 1) % 10 + '0'));
} else {
if (Character.isUpperCase(c)) {
char next = (char) ((c - 'A' + 1) % 26 + 'A');
res.append(Character.toLowerCase(next));
} else {
char next = (char) ((c - 'a' + 1) % 26 + 'a');
res.append(Character.toUpperCase(next));
}
}
}
return res;
}
// 解密
static StringBuilder decrypt(String s) {
StringBuilder res = new StringBuilder();
char c = ' ';
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i);
if (Character.isDigit(c)) {
c = c == '0' ? '9': (char)(c - 1);
res.append(c);
} else {
if (Character.isUpperCase(c)) {
c = Character.toLowerCase(c);
c = c == 'a' ? 'z' : (char) (c - 1);
res.append(c);
} else {
c = Character.toUpperCase(c);
c = c == 'A' ? 'Z' : (char) (c - 1);
res.append(c);
}
}
}
return res;
}
}
打表 :star:
从 题解区大佬 学到的打表方法,比较巧妙
import java.util.*;
public class Main {
private static final String L1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
private static final String L2 = "BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza1234567890";
private static Map<Character, Character> encryptMap = new HashMap<>();
private static Map<Character, Character> decryptMap = new HashMap<>();
static {
for (int i = 0; i < L1.length(); i++) {
encryptMap.put(L1.charAt(i), L2.charAt(i));
}
for (int i = 0; i < L2.length(); i++) {
decryptMap.put(L2.charAt(i), L1.charAt(i));
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String line1 = in.nextLine();
String line2 = in.nextLine();
System.out.println(encrypt(line1));
System.out.println(decrypt(line2));
in.close();
}
// 加密
static StringBuilder encrypt(String s) {
StringBuilder res = new StringBuilder();
char c = ' ';
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i);
res.append(encryptMap.get(c));
}
return res;
}
// 解密
static StringBuilder decrypt(String s) {
StringBuilder res = new StringBuilder();
char c = ' ';
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i);
res.append(decryptMap.get(c));
}
return res;
}
}
上述加密、解密函数存在重复部分,可将这两个方法进一步精简为一个方法
process
import java.util.*;
public class Main {
private static final String L1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
private static final String L2 = "BCDEFGHIJKLMNOPQRSTUVWXYZAbcdefghijklmnopqrstuvwxyza1234567890";
private static Map<Character, Character> encryptMap = new HashMap<>();
private static Map<Character, Character> decryptMap = new HashMap<>();
static {
for (int i = 0; i < L1.length(); i++) {
encryptMap.put(L1.charAt(i), L2.charAt(i));
}
for (int i = 0; i < L2.length(); i++) {
decryptMap.put(L2.charAt(i), L1.charAt(i));
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String line1 = in.nextLine();
String line2 = in.nextLine();
System.out.println(procss(line1, 1));
System.out.println(procss(line2, -1));
in.close();
}
// id = 1: 加密;id = -1: 解密
static StringBuilder procss(String s, int id) {
StringBuilder res = new StringBuilder();
char c = ' ';
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i);
if (id == 1) res.append(encryptMap.get(c));
if (id == -1) res.append(decryptMap.get(c));
}
return res;
}
}