题解 | #字符串加解密# 使用Map集合存储对应的输出数据
字符串加解密
https://www.nowcoder.com/practice/2aa32b378a024755a3f251e75cbf233a
因为每个字符加密或者解密都是有着严格的一一对应关系,所以采用Map处理
解密是加密的逆过程,但是map只能通过key取value,所以想着用数组来存储对应的 加密,解密 后对应的字符
然后就是向map中添加数据了,首尾处需要特殊处理,就单独put了。
最后遍历字符串,碰到字母或者数字,就从map中取对应的value值
ps :感觉用Integer类型的map 可能更好些,不用写这么多强转了,只需要最后输出的时候在转一下就可以了~~
<纪念第一次写题解>
import java.io.*; import java.util.*; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String s1; while ((s1 = br.readLine()) != null) { String s2 = br.readLine(); System.out.println(pwdOp(s1, 0)); System.out.println(pwdOp(s2, 1)); } } // 使用int类型定义密码处理方式(0 代表加密,1 代表解密) public static String pwdOp(String s, int type) { Map<Character, Character[]> map = new HashMap<>(); Character[] chars = new Character[2]; //对应的, char数组中 0 存储加密后对应字符,1存储解密对应的字符 //首尾处较为特殊单拎出来put, map.put('Z', new Character[] {'a', 'y'}); map.put('z', new Character[] {'A', 'Y'}); map.put('A', new Character[] {'b', 'z'}); map.put('a', new Character[] {'B', 'Z'}); map.put('0', new Character[] {'1', '9'}); map.put('9', new Character[] {'0', '8'}); // 循环添加每个字母对应的加密解密后的字符 for (int i = 66; i < 90; i++) { map.put((char) i, new Character[] {(char) (i + 33), (char) (i + 31)}); map.put((char) (i + 32), new Character[] {(char) (i + 1), (char) (i - 1)}); } // 数字添加 for (int i = 49; i < 57; i++) { map.put((char)i, new Character[] {(char) (i + 1), (char) (i - 1)}); } // StringBuilder来处理输出数据 StringBuilder sb = new StringBuilder(); // 遍历字符串,输出对应的value,注意其他字符不做处理,直接添加即可 for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if (c >= 48 && c <= 57 || (c >= 65 && c <= 90) || (c >= 97 && c <= 122)) { sb.append(map.get(c)[type]); } else { sb.append(c); } } return sb.toString(); } }