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

news/2024/7/20 18:49:46 标签: 华为od, java, 开发语言

在这里插入图片描述

目录

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

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卷 200分 考生抽中题】

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

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

在这里插入图片描述


http://www.niftyadmin.cn/n/5025691.html

相关文章

LeetCode题解:1720. 解码异或后的数组,异或,JavaScript,详细注释

原题链接&#xff1a; https://leetcode.cn/problems/decode-xored-array/ 解题思路&#xff1a; 异或有如下性质&#xff1a; a ^ a 0a ^ 0 aa ^ b b ^ a 根据题意&#xff0c;已知encoded[i - 1] arr[i - 1] ^ arr[i]&#xff0c;可以做如下转换&#xff1a; encoded[i…

更改微软Microsoft Store软件下载安装路径+Microsoft 登录不上的解决办法

第一个&#xff1a;更改微软Microsoft Store软件下载安装路径&#xff08;一般都是安装插件啊啥的会遇到&#xff09; 点击“开始”&#xff0c;找到“设置”&#xff1a; 点击“存储”&#xff1a; 依次点击“高级存储设置”、“保存新内容的地方”&#xff1a; 第一个&#…

三分钟学会一个新技能——使用Java操作Redis

目录 1、前置准备操作 1.1、为什么要进行前置准备操作 1.2、本地如何访问到云服务上Redis的6379端口号 1.3、配置步骤&#xff1a; 2、配置后本地主机如何操作 3、常用命令举例 3.1、通用命令举例 3.2、string相关命令举例 3.3、hash相关命令举例 3.4、list相关命令…

【深入理解Linux锁机制】六、信号量

系列文章: 我的圈子:高级工程师聚集地 【深入理解Linux锁机制】一、内核锁的由来 【深入理解Linux锁机制】二、中断屏蔽 【深入理解Linux锁机制】三、原子操作 【深入理解Linux锁机制】四、自旋锁 【深入理解Linux锁机制】五、衍生自旋锁 【深入理解Linux锁机制】六、信…

项目实战— pytorch搭建CNN处理MNIST数据集

项目文件夹介绍 项目文件夹 CNN_MNIST_practice文件夹是整个项目的文件夹&#xff0c;里面存放了六个子文件夹以及四个 .py 程序&#xff0c;接下来我们分别来介绍这些文件的内容。 其中 minist_all_CPU.py 是CPU版本的模型训练&#xff0b;测试程序&#xff0c;而 min…

数据可视化大屏模板 | 保姆级使用教程

近来很多朋友私信咨询怎么下载使用数据可视化大屏模板&#xff0c;在这里就给大家做一个相对简单的教程总结。有需要的朋友记得先收藏保存&#xff0c;以便不时之需。 数据可视化大屏制作软件&#xff1a;奥威BI系统 数据可视化报表模板板块&#xff1a;模板秀 主要操作&…

shell脚本之sed命令

shell脚本之sed命令 sed 命令的一些常用选项sed 命令的一些常用命令具体例子 sed 在 Shell 脚本中非常常用&#xff0c;可以用于文本替换、插入、删除等操作。 以下是 sed 命令的基本语法&#xff1a; sed [选项] 命令 [文件...]其中&#xff0c;选项是可选的&#xff0c;可以…

wav文件碎片多删除后恢复案例

wav是微软针对音频提供的一种文件&#xff0c;其本质上和qt类文件&#xff08;如mp4 mov&#xff09;是一样的&#xff0c;都是“容器”类文件。但凡是容器类的文件其关注的点就是制定规则&#xff0c;一切按规则来&#xff08;wav中就是速率、时长、编码类型等&#xff09;。这…