题目:
题目描述:
给你一串未加密的字符串 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);}
}
验证结果: