前言
进过前器的数据结构和算法学习,开始以OD机考题作为练习题,看看算法和数据结构掌握情况。有需要练习的可以关注下。
描述
对输入的字符串进行加解密,并输出。
加密方法为:
当内容是英文字母时则用该英文字母的后一个字母替换,同时字母变换大小写,如字母a时则替换为B;字母Z时则替换为a;
当内容是数字时则把该数字加1,如0替换1,1替换2,9替换0;
其他字符不做变化。
解密方法为加密的逆过程。
数据范围:输入的两个字符串长度满足 1≤𝑛≤1000 1≤n≤1000 ,保证输入的字符串都是只由大小写字母或者数字组成
输入描述:
第一行输入一串要加密的密码
第二行输入一串加过密的密码
输出描述:
第一行输出加密后的字符
第二行输出解密后的字符
示例1
输入:
abcdefg BCDEFGH输出:
BCDEFGH abcdefg
实现原理
1.本题同样考察对应字符的转换,按转换规则完成相应转换即可。
此外,还有建立转换的关系的码表,进行映射也是一种不错的解题思路,至少代码比较简洁优雅。
实现代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
// 注意 hasNext 和 hasNextLine 的区别
String input = in.nextLine();
String output=encode(input);
System.out.println(output);
String input1 = in.nextLine();
String output1=decode(input1);
System.out.println(output1);
in.close();
}
public static String encode(String input) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < input.length(); i++) {
if (input.charAt(i) >= 'a' && input.charAt(i) <= 'y') {
sb.append((char)(input.charAt(i) - 31));
}
if (input.charAt(i) == 'z') {
sb.append('A');
}
if (input.charAt(i) == 'Z') {
sb.append('a');
}
if (input.charAt(i) >= 'A' && input.charAt(i) <= 'Y') {
sb.append((char)(input.charAt(i) + 33));
}
if (input.charAt(i) >= '0' && input.charAt(i) <= '8') {
sb.append((char)(input.charAt(i) + 1));
}
if (input.charAt(i) == '9') {
sb.append(0);
}
}
return sb.toString();
}
public static String decode(String input) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < input.length(); i++) {
if (input.charAt(i) >= 'b' && input.charAt(i) <= 'z') {
sb.append((char)(input.charAt(i) - 33));
}
if (input.charAt(i) == 'a') {
sb.append('Z');
}
if (input.charAt(i) == 'A') {
sb.append('z');
}
if (input.charAt(i) >= 'B' && input.charAt(i) <= 'Z') {
sb.append((char)(input.charAt(i) + 31));
}
if (input.charAt(i) >= '1' && input.charAt(i) <= '9') {
sb.append((char)(input.charAt(i) - 1));
}
if (input.charAt(i) == '0') {
sb.append(9);
}
}
return sb.toString();
}
}