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

专栏导读

本专栏收录于《华为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]。
 * <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]

  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分)-LMLPHP


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

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

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

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

09-15 01:00