华为OD机试 - 字符串加密(Java 2023 B卷 100分)

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、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)。

三、输出描述

每组测试数据输出一行,表示字符串的密文。

四、解题思路

题目很简单,多读几遍,其义自见。

我的做题思路是:

  1. 先找出最长的字符串,初始化偏移量集合numList,比如[1,2,4,7,13];
  2. 遍历每一个输入的字符串,获取每一个字符,按照题目规则,进行偏移即可;
  3. 核心算法:若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]。
 * 

* 例如:原文 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]

  1. 第二个字符串xyz
    • 第一个字符x偏移量是1,即为y;
    • 第二个字符y偏移量是2,即为a;
    • 第三个字符z偏移量是4,即为d;
    • 故输出yad;
  2. 第二个字符串xyza
    • 第一个字符x偏移量是1,即为y;
    • 第二个字符y偏移量是2,即为a;
    • 第三个字符z偏移量是4,即为d;
    • 第四个字符a偏移量是7,即为h;
    • 故输出yadh;
  3. 第三个字符串xyzab
    • 第一个字符x偏移量是1,即为y;
    • 第二个字符y偏移量是2,即为a;
    • 第三个字符z偏移量是4,即为d;
    • 第四个字符a偏移量是7,即为h;
    • 第五个字符b偏移量是13,即为o;
    • 故输出yadho;

很简单,但是有点繁琐。

华为OD机试 - 字符串加密(Java 2023 B卷 100分)_第1张图片


下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,java,开发语言)