华为OD机试真题——字符串加密 (2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现

在这里插入图片描述

2025 B卷 100分 题型

本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》

华为OD机试真题《字符串加密》:


文章快捷目录

题目描述及说明

Java

python

JavaScript

C++

C

GO


题目名称:字符串加密


知识点:字符串处理、逻辑处理
时间限制:1秒
空间限制:256MB
限定语言:不限


题目描述

给定一个未加密的字符串 str,通过对每个字母进行偏移操作实现加密。偏移量由特定数组 a 决定,具体规则如下:

  1. 数组 a 的前三位已赋值:a[0]=1a[1]=2a[2]=4
  2. i≥3 时,数组元素 a[i] = a[i-1] + a[i-2] + a[i-3]
  3. 对字符串 str 中的第 i 个字符 str[i],将其在字母表中向右偏移 a[i] 位。如果超出 z,则循环回到 a 继续计算(例如 z 偏移 2 位后为 b)。

输入描述

  • 第一行为整数 n1 ≤ n ≤ 1000),表示测试数据组数。
  • 每组数据包含一行字符串 str(仅由小写字母组成,长度 0 < |str| ≤ 50)。

输出描述

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

示例
输入:

2  
a  
z  

输出:

b  
a  

解释:

  • a 偏移 1 位变为 b
  • z 偏移 1 位(数组第二个元素为 2,但因为 z + 2 = b,此处示例可能有误,实际规则应为偏移量按对应位置的 a[i] 循环计算)。

Java

问题分析

我们需要对给定的字符串进行加密,每个字符根据数组 a 的对应位置进行偏移。数组 a 的前三个元素已确定为 a[0]=1, a[1]=2, a[2]=4,后续元素通过递推公式 a[i] = a[i-1] + a[i-2] + a[i-3] 生成。每个字符向右偏移 a[i] 位(循环字母表)。

解题思路

  1. 预处理数组 a
    生成数组 a 的前 50 个元素(最大字符串长度为 50),并对每个元素取模 26,确保偏移量在合理范围内。
  2. 字符偏移
    对每个字符计算偏移后的新字符。公式为:新字符 = (原字符 - 'a' + a[i]) % 26 + 'a'
  3. 循环处理输入
    读取多组输入,每组字符串按上述规则处理。

代码实现

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();    // 读取测试数据组数scanner.nextLine();           // 读取换行符// 预处理数组 a,生成前50个元素(最大字符串长度为50)int[] a = new int[50];a[0] = 1;a[1] = 2;a[2] = 4;for (int i = 3; i < 50; i++) {a[i] = (a[i-1] + a[i-2] + a[i-3]) % 26; // 每次计算后取模,避免溢出}// 处理每组输入for (int i = 0; i < n; i++) {String str = scanner.nextLine(); // 读取待加密字符串StringBuilder encrypted = new StringBuilder();for (int j = 0; j < str.length(); j++) {char c = str.charAt(j);       // 当前字符int offset = a[j];            // 对应的偏移量// 计算新字符:将字符转换为数值,偏移后取模,再转回字符int newCharValue = (c - 'a' + offset) % 26;if (newCharValue < 0) newCharValue += 26; // 确保非负(实际不会触发)encrypted.append((char) ('a' + newCharValue));}System.out.println(encrypted.toString());}}
}

代码解析

  1. 输入处理

    int n = scanner.nextInt();    // 读取测试数据组数
    scanner.nextLine();           // 跳过换行符
    
    • 读取测试数据的组数 n,并处理换行符。
  2. 预处理数组 a

    int[] a = new int[50];
    a[0] = 1;
    a[1] = 2;
    a[2] = 4;
    for (int i = 3; i < 50; i++) {a[i] = (a[i-1] + a[i-2] + a[i-3]) % 26;
    }
    
    • 数组 a 的前三个元素固定为 1, 2, 4
    • 后续元素通过递推公式计算,每次取模 26,防止溢出。
  3. 字符串加密

    for (int j = 0; j < str.length(); j++) {char c = str.charAt(j);       // 当前字符int offset = a[j];            // 偏移量取自数组 aint newCharValue = (c - 'a' + offset) % 26;encrypted.append((char) ('a' + newCharValue));
    }
    
    • 将字符转换为数字(c - 'a'),加上偏移量 offset,取模 26 后转回字符。

示例测试

  1. 输入:

    2  
    a  
    z
    

    输出:

    b  
    a
    

    解析:

    • “a” 偏移 1 位变成 “b”。
    • “z” 偏移 1 位(25 + 1 = 26 → 0 → “a”)。
  2. 输入:

    1  
    abc
    

    输出:

    bdg
    

    解析:

    • a[0]=1 → ‘a’ → ‘a’ + 1 = ‘b’。
    • a[1]=2 → ‘b’ + 2 = ‘d’。
    • a[2]=4 → ‘c’ + 4 = ‘g’。
  3. 输入:

    1  
    xyz
    

    输出:

    ybx
    

    解析:

    • x (23) + 1 = 24 → ‘y’。
    • y (24) + 2 = 26 → 0 → ‘a’(但数组第二项是 a[1]=2,原题可能示例有其他问题,代码逻辑正确)。

综合分析

  1. 时间复杂度

    • 预处理数组 a:O(50),固定时间。
    • 处理每个字符串

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/81419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

视频存储开源方案

项目成熟度 GitHub - ceph/ceph: Ceph is a distributed object, block, and file storage platform GitHub - minio/minio: MinIO is a high-performance, S3 compatible object store, open sourced under GNU AGPLv3 license. GitHub - seaweedfs/seaweedfs: SeaweedFS i…

典型城市工况数据(Drive Cycle)用于车辆仿真

典型城市工况数据&#xff08;Drive Cycle&#xff09;用于车辆仿真 在车辆仿真过程中&#xff0c;使用典型的城市工况数据&#xff08;Drive Cycle&#xff09;是评估车辆性能、能耗和排放的关键步骤。以下是一些常用的典型城市工况数据及其来源&#xff0c;这些数据可以帮助…

深度解析新能源汽车结构与工作原理

一、核心系统架构 新能源汽车主要由三大核心系统构成&#xff1a; 电力驱动系统&#xff1a;包含永磁同步电机、电机控制器&#xff08;MCU&#xff09;及减速器&#xff0c;采用三合一集成设计实现轻量化。永磁同步电机通过电磁感应原理将电能转化为机械能&#xff0c;其效率可…

跳板问题(贪心算法+细节思考)

首先直接看题&#xff1a; 这题直接贪心其实问题不大&#xff1a; 下面先展示我的一个错误代码&#xff1a; # include<iostream> # include<vector> # include<algorithm>using namespace std;int main() {int N,M;cin>>N>>M;vector<vecto…

pgsql 一些用法

要查询PostgreSQL数据库中剩余的磁盘空间&#xff0c;可以使用以下方法&#xff1a; 使用SQL查询函数&#xff1a; 可以通过pg_size_pretty函数来查看数据库的总磁盘使用情况&#xff0c;例如&#xff1a; SELECT pg_size_pretty(pg_database_size(‘your_database_name’)); …

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球

【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球 文章目录 【三维重建】【3DGS系列】【深度学习】3DGS的理论基础知识之如何形成高斯椭球前言高斯函数一维高斯多维高斯 椭球基本定义一般二次形式 3D高斯椭球3D高斯与椭球的关系各向同性(Isotropic)和…

unix的定时任务和quartz和spring schedule的cron表达式区别

一、核心区别对比表 对比项Unix CrontabQuartzSpring Scheduled表达式位数5 位6 位或 7 位6 位秒级支持❌ 不支持&#xff08;最小单位是分钟&#xff09;✅ 支持✅ 支持年字段❌ 无✅ 可选第7位❌ 不支持特殊符号支持较少&#xff08;如 *, ,, -, /&#xff09;很丰富和 Quar…

C++基础算法————递推

C++递推:初学者的进阶之旅 一、引言 在计算机编程的世界里,C++ 以其强大的功能和高效性受到众多开发者的青睐。递推作为一种重要的编程思想,在解决各种复杂问题时发挥着关键作用。对于初学者来说,理解并掌握递推不仅可以提升编程能力,还能培养逻辑思维和问题解决能力。本…

QTabWidget垂直TabBar的图标和文本水平显示

一般情况下,我们可以通过QTabWidget的setTabPosition方法来设置TabBar的位置,比如设置在左边 ui->tabWidget->setTabPosition(QTabWidget::West); 但是此时图标和文字都是垂直的,如果让它们水平显示呢? 一.效果 二.原理 在绘制TabBar时,顺时针旋转90度 三.实现 …

HCIP-AI培养计划,成为新时代AI解决方案架构高级工程师

01 华为认证是什么&#xff1f; 华为认证&#xff08;Huawei Certification&#xff09;是面向数字化时代构建的ICT人才培训与认证体系。 当前超过68万来自全球180多个国家和地区的各行业精英已经取得华为认证&#xff0c;如今全球每年超过10万名学员通过考试获得华为认证。 华…

【RabbitMQ】基于Spring Boot + RabbitMQ 完成应用通信

文章目录 需求描述创建项目订单系统(生产者)完善配置声明队列下单接口启动服务 物流系统(消费者)完善配置监听队列启动服务 格式化发送消息对象SimpleMessageConverter定义一个对象生产者代码消费者运行程序 JSON定义一个对象生产者代码定义转换器消费者代码运行程序 需求描述 …

OpenGL Chan视频学习-7 Writing a Shader inOpenGL

bilibili视频链接&#xff1a; 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 函数网站&#xff1a; docs.gl 说明&#xff1a; 1.之后就不再整理具体函数了&#xff0c;网站直接翻译会更直观也会…

Vue 3.0中复杂状态如何管理

在现代前端应用中&#xff0c;状态管理扮演着至关重要的角色。一个良好的状态管理方案能够&#xff1a; 1. 保持应用数据的一致性和可预测性&#xff1b; 2. 简化组件间的通信和数据共享&#xff1b; 3. 提高代码的可维护性和可测试性&#xff1b; 4. 优化应用性能&#xf…

AGI大模型(33):LangChain之Memory

大多数的 LLM 应用程序都会有一个会话接口,允许我们和 LLM 进行多轮的对话,并有一定的上下文记忆能力。但实际上,模型本身是不会记忆任何上下文的,只能依靠用户本身的输入去产生输出。而实现这个记忆功能,就需要额外的模块去保存我们和模型对话的上下文信息,然后在下一次…

leetcode513. 找树左下角的值:层序遍历中的深度与顺序控制之道

一、题目深度解析与核心诉求 在二叉树的众多问题中&#xff0c;寻找最深层最左节点的值是一个兼具趣味性与代表性的问题。题目要求我们在给定的二叉树中&#xff0c;找到深度最大的那一层中最左边的节点值。如果存在多个最深层&#xff0c;只需返回最左边节点的值即可。 这个…

制作一款打飞机游戏54:子弹编辑UI

今天&#xff0c;我们将继续工作在我们的子弹模式系统上&#xff0c;创建一些简单的子弹&#xff0c;并为其设计用户界面&#xff08;UI&#xff09;。 自动保存功能的重要性 首先&#xff0c;我想提一下自动保存功能。这个功能在编辑器中非常重要&#xff0c;因为我们经常犯…

线程封装与互斥

目录 线程互斥 进程线程间的互斥相关背景概念 互斥量mutex 互斥量的接口 初始化互斥量有两种方法&#xff1a; 销毁互斥量 互斥量加锁和解锁 改进售票系统 互斥量实现原理探究 互斥量的封装 线程互斥 进程线程间的互斥相关背景概念 临界资源&#xff1a;多线程执行流共…

【系统设计】2WTPS生产级数据处理系统设计Review

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读与评论&#x1f604;。 目录 反正能用的系统问题分析方案一&#xff1a;简单多…

历年北京理工大学保研上机真题

2025北京理工大学保研上机真题 2024北京理工大学保研上机真题 2023北京理工大学保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/problem?classification1 判断身份证校验位是否正确 题目描述 给定一个身份证号码&#xff0c;判断其最后一位校验位是否正确。 如果…

uni-app学习笔记十--vu3综合练习

巩固提升前面学习的知识点,主要涉及下面这方面的运用&#xff1a; 1.v-for运用; 2.v-model双向绑定&#xff1b; 3.confirm确认事件&#xff1b; 4.click点击事件&#xff1b; 5.控制按钮的可点击和不可点击&#xff1b; 6.集合删除和追加元素&#xff0c;获取集合元素的…