目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
给你一串未加密的字符串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)。
三、输出描述
每组测试数据输出一行,表示字符串的密文。
四、解题思路
题目很简单,多读几遍,其义自见。
我的做题思路是:
- 先找出最长的字符串,初始化偏移量集合numList,比如[1,2,4,7,13];
- 遍历每一个输入的字符串,获取每一个字符,按照题目规则,进行偏移即可;
- 核心算法:若z+1则结果为a;
五、Java算法源码
package com.guor.od;import java.util.*;/*** 每一个字母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]。* <p>* 例如:原文 abcde 加密后 bdgkr,其中偏移量分别是1,2,4,7,13。*/
public class OdTest01 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = Integer.parseInt(scanner.nextLine());ArrayList<String> strList = new ArrayList<>();// 输入行字符串的最大长度,用于初始化最大偏移量集合int maxLength = 0;// 初始化数据for (int i = 0; i < n; i++) {System.out.println("请输入第" + (i + 1) + "个字符:");String line = scanner.nextLine();strList.add(line);if (line.length() > maxLength) {maxLength = line.length();}}// 偏移量集合List<Integer> numList = getNumList(maxLength);for (int i = 0; i < strList.size(); i++) {// 每一行字符串的每一个字符集合char[] charArr = strList.get(i).toCharArray();// 偏移之后的字符串StringBuilder builder = new StringBuilder();for (int j = 0; j < charArr.length; j++) {int index = charArr[j];index = index + numList.get(j);// 核心算法:若z+1则结果为aif(index > (int) 'z'){int preA = (int) 'a'-1;index = index % (int) 'z' + preA;}builder.append((char) index);}System.out.println(builder.toString());}}/*** 初始化最大偏移量集合* @param maxLength 最大偏移量*/private static List<Integer> getNumList(int maxLength) {List<Integer> numList = new ArrayList<>();numList.add(1);numList.add(2);numList.add(4);if (maxLength <= 3) {return numList;}// 当i>=3时,数组元素a[i]=a[i-1]+a[i-2]+a[i-3]。for (int i = 3; i < maxLength; i++) {numList.add(numList.get(i - 1)+ numList.get(i - 2) + numList.get(i - 3));}return numList;}
}
六、效果展示
1、输入
3
xyz
xyza
xyzab
2、输出
yad
yadh
yadho
3、说明
获取3个字符串最大长度maxLength = 5。
偏移量集合规则:
- 数组a前三位已经赋值:a[0]=1,a[1]=2,a[2]=4。
- 当i>=3时,数组元素a[i]=a[i-1]+a[i-2]+a[i-3]。
初始化偏移集合[1,2,4,7,13]
- 第二个字符串xyz
- 第一个字符x偏移量是1,即为y;
- 第二个字符y偏移量是2,即为a;
- 第三个字符z偏移量是4,即为d;
- 故输出yad;
- 第二个字符串xyza
- 第一个字符x偏移量是1,即为y;
- 第二个字符y偏移量是2,即为a;
- 第三个字符z偏移量是4,即为d;
- 第四个字符a偏移量是7,即为h;
- 故输出yadh;
- 第三个字符串xyzab
- 第一个字符x偏移量是1,即为y;
- 第二个字符y偏移量是2,即为a;
- 第三个字符z偏移量是4,即为d;
- 第四个字符a偏移量是7,即为h;
- 第五个字符b偏移量是13,即为o;
- 故输出yadho;
很简单,但是有点繁琐。
🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。