题目:
题目描述:
给你一串未加密的字符串 str,通过对字符串的每一个字母进行改变来实现加密,加密方式
是在每一个字母str[i]偏移特定数组元素a[i]的量,数组a前三位已经赋值:
a[0]=1,a[1]=2,a[2]=4。
当 i>=3 时,数组元素 a[i]=a[i-1]+a[i-2]+a[i-3],
例如:原文 abcde 加密后 bdgkr,其中偏移量分别是 1,2,4,7,13。
输入描述:
第一行为一个整数 n(1<=n<=1000),表示有 n 组测试数据,每组数据包含一行,原文 str
(只含有小写字母,0<长度<=50)。
输出描述:
每组测试数据输出一行,表示字符串的密文
补充说明:
解答要求
时间限制:2000ms,内存限制:64MB
题解:
这个不难,主要是注意需要构建一个字符和偏移量数字的对应Map关系。然后遍历这个map来拿到输出的字符串。
代码:
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class ChangeWords {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int dataCount = Integer.valueOf(sc.nextLine());
String[] strings = new String[dataCount];
for (int i = 0; i < dataCount; i++) {
strings[i] = sc.nextLine();
}
Map<Integer, Character> charMap = new HashMap<>();
for (int i = 0; i < 26; i++) {
if (i == 0) {
charMap.put(0, 'a');
} else {
charMap.put(i, (char) ('a' + i));
}
}
int[] arr = new int[51];
arr[0] = 1;
arr[1] = 2;
arr[2] = 4;
for (int i = 3; i < 51; i++) {
arr[i] = (arr[i - 1] + arr[i - 2] + arr[i - 3]) % 26;
}
for(int i =0;i < dataCount; i++){
System.out.println(getChangeWords(strings[i],charMap,arr));
}
}
private static String getChangeWords(String changeWords, Map<Integer, Character> charMap, int[] arr) {
char[] charArrys = changeWords.toCharArray();
char[] changeArrys = new char[charArrys.length];
for (int i = 0; i < charArrys.length; i++) {
int index = charArrys[i]-'a';
int changeIndex = (index+arr[i])%26;
changeArrys[i] = charMap.get(changeIndex);
}
return String.valueOf(changeArrys);
}
}
验证结果: