目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、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则结果为a
if(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在线答疑。