当前位置: 首页 > news >正文

【备战秋招】每日一题:2023.05.10-华为OD机试(第二题)-解密

为了更好的阅读体检,可以查看我的算法学习博客

在线评测链接:P1307

题目内容

在全球恐怖主义危机下,一组间谍团队接收到了来自地下工作者的一串神秘代码。这组代码可以帮助他们访问恐怖分子的服务器,但是他们需要先解密代码才能使用它。代码是由数字 0 0 0 - 9 9 9 组成的字符串 M M M,而解密过程需要一个秘钥数字 N N N 和一个运算符 k k k (加减乘中的一个)。

解密过程分为三个步骤:

第一步,团队成员需要使用秘钥数字 N N N M M M 进行一系列 k k k 运算,并尝试截取其中的一段数字 x x x。如果 x x x N N N 的运算结果是一个所有位数相同的数字,那么这段数字就有可能是真正的密码。例如,如果 x x x 111 111 111 N N N 2 2 2 k k k 为乘法,那么计算结果是 111 × 2 = 222 111 \times 2 = 222 111×2=222,满足条件,因此 111 111 111 就是所寻找的目标密码串之一。

第二步,如果存在多种满足第一点条件的情况,那么团队成员需要选择计算结果最大的一种作为真正的密码。

第三步,团队成员们需要在 M M M M M M的长度不超过100) 中找到长度为 3 3 3 12 12 12 位的密码串,并尝试使用秘钥数字 N N N 和运算符 k k k k k k + + + − - ∗ * 的一种)进行解密。由于秘钥数字 N N N 可能非常大,因此需要确保 N N N 不大于 9999999999 9999999999 9999999999。另外,在乘法场景下,团队成员们约定乘数最大为 3 3 3 位数,以避免数据过于庞大。
如果没有找到符合条件的密码串,则输出 − 1 -1 1,表示密码串不存在。

输入描述

输入第一行为加密后的字符串 M M M

输入第二行为密钥数字 N N N

输入第三行为运算符 k k k

输出

满足计算结果所有位数相同,且计算结果最大的值。

样例1

输入

6833023887793076998810418710
2211
-

输出

9988

解释:通过计算, 8877 8877 8877 - 2211 2211 2211= 6666 6666 6666 9988 9988 9988 - 2211 2211 2211 = 7777 7777 7777,因为 7777 7777 7777 > 6666 6666 6666,则目标密码串为 9988 9988 9988

样例2

输入

68846787793076946788418710
4210
+

输出

884678

解释:通过计算,符合条件有两个, 884678 884678 884678 + 4210 4210 4210 = 888888 888888 888888 4678 4678 4678 + 4210 4210 4210 = 8888 8888 8888。则目标密码串为 884678 884678 884678

样例3

输入

139804444677899222
2
*

输出

4444

解释:作为乘法场景,乘数最大值为 3 3 3 位数,本用例乘数为 2 2 2 。按要求, 4444 4444 4444 * 2 2 2 = 8888 8888 8888 222 222 222 * 2 2 2 = 444 444 444,均符合基本条件,从中选择结果最大值则目标密码串是 4444 4444 4444

思路:模拟+枚举

我们现在有一串数字字符串 M M M ,同时还有另一串数字字符串 N N N 以及一个运算符 k ∈ { ′ + ′ , ′ − ′ , ′ ∗ ′ } k\in\left\{'+','-','*'\right\} k{+,,},我们需要找到 M M M 中是否有一串数字(长度为3-12)组成的整数,该整数与 N N N 组成的整数进行字符 k k k 代表的运算后,能使得运算结果的所有数位都是同一个数字,比如6666。

和该日华为第一题一样,直接按照题意模拟即可。

由于规定密码串的长度为3~12位,且要求计算结果最大。因此我们可以从大到小枚举密码串的长度,也即我们从数字字符串 M M M 中取出的连续数字字符的个数。用这些数字字符构成一个整数后,与数字串 N N N 进行运算,并判断运算结果是否符合要求即可。

比如字符串 M M M 12345678987654321 12345678987654321 12345678987654321,而我们枚举到的密码串长度是12,于是我们先取出数字 123456789876 123456789876 123456789876 进行判断。判断结束后,再取出数字 234567898765 234567898765 234567898765 继续判断。循环往复,如果12的长度不存在答案,那么就继续往下枚举密码串长度11,直到找到符合要求的数字串为止。

时间复杂度为枚举与运算的时间复杂度,枚举密码串长度次数为 k = m i n ( N , 12 ) k=min(N,12) k=min(N,12),判断密码串是否符合要求同样也需要约 O ( k ) O(k) O(k)的时间复杂度。其中, N N N 为字符串 M M M 的长度,需要遍历一遍字符串,因此时间复杂度为 O ( k 2 N ) O(k^2N) O(k2N)

类似题目推荐

代码

C++

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define ll long longll N;
ll ans=-1;
int len;
char s[105];
char op;bool check(ll x,char op){if(op=='-') x-=N;else if(op=='*') x*=N;else if(op=='+') x+=N;int number = x%10;while(x){if(x%10!=number) return false;x/=10;}return true;
}int main(){scanf("%s",s+1);// 读入字符串 len=strlen(s+1);scanf("%lld",&N);// 读入密钥数字 scanf("%c",&op);// 读入运算符k// 滤去多余字符如'\n'等,保证运算符为+-* while(op!='+'&&op!='-'&&op!='*') scanf("%c",&op);// 最长12位,但是字符串可能不足12,取小 int m=min(len,12);ll mod,tmp;for(int i=m;i>=3;--i){mod=pow(10,i-1);tmp=0;for(int j=1;j<i;++j){tmp=tmp*10+s[j]-'0';}for(int j=i;j<=len;++j){tmp=tmp*10+s[j]-'0';//循环运算,每次取模去掉最高位,再*10 加上当前位为当前数字 if(check(tmp,op)){// 判断答案ans=max(ans,tmp);}tmp%=mod;}}printf("%lld",ans);return 0;
}

python

import mathN = 0
ans = -1
len = 0
s = ''
op = ''def check(x, op):global Nif op == '-':x -= Nelif op == '*':x *= Nelif op == '+':x += Nnumber = x % 10while x:if x % 10 != number:return Falsex //= 10return Trues = input()  # 读入字符串
len = len(s)
N = int(input())  # 读入密钥数字
op = input()  # 读入运算符
# 滤去多余字符如'\n'等,保证运算符为+-*
while op != '+' and op != '-' and op != '*':op = input()# 最长12位,但是字符串可能不足12,取小
m = min(len, 12)
mod = 0
tmp = 0
for i in range(m, 2, -1):mod = math.pow(10, i - 1)tmp = 0for j in range(1, i):tmp = tmp * 10 + int(s[j])for j in range(i, len + 1):tmp = tmp * 10 + int(s[j])  # 循环运算,每次取模去掉最高位,再*10加上当前位为当前数字if check(tmp, op):  # 判断答案ans = max(ans, tmp)tmp %= modprint(ans)

Java

import java.util.Scanner;public class Main {static long N;static long ans = -1;static int len;static char[] s;static char op;static boolean check(long x, char op) {if (op == '-') x -= N;else if (op == '*') x *= N;else if (op == '+') x += N;int number = (int)(x % 10);while (x != 0) {if (x % 10 != number) return false;x /= 10;}return true;}public static void main(String[] args) {Scanner input = new Scanner(System.in);s = input.next().toCharArray(); // 读入字符串len = s.length;N = input.nextLong(); // 读入密钥数字op = input.next().charAt(0); // 读入运算符// 滤去多余字符如'\n'等,保证运算符为+-*while (op != '+' && op != '-' && op != '*') op = input.next().charAt(0);// 最长12位,但是字符串可能不足12,取小int m = Math.min(len, 12);long mod, tmp;for (int i = m; i >= 3; i--) {mod = (long)Math.pow(10, i - 1);tmp = 0;for (int j = 1; j < i; j++) {tmp = tmp * 10 + (s[j] - '0');}for (int j = i; j <= len; j++) {tmp = tmp * 10 + (s[j] - '0'); // 循环运算,每次取模去掉最高位,再*10加上当前位为当前数字if (check(tmp, op)) { // 判断答案ans = Math.max(ans, tmp);}tmp %= mod;}}System.out.println(ans);}
}

Go

package mainimport ("fmt""math"
)var (N   int64 = 0ans int64 = -1len ints   stringop  byte
)func check(x int64, op byte) bool {if op == '-' {x -= N} else if op == '*' {x *= N} else if op == '+' {x += N}number := x % 10for x != 0 {if x%10 != number {return false}x /= 10}return true
}func main() {fmt.Scan(&s)            // 读入字符串len = len(s)fmt.Scan(&N)            // 读入密钥数字fmt.Scanf("%c", &op)    // 读入运算符// 滤去多余字符如'\n'等,保证运算符为+-*for op != '+' && op != '-' && op != '*' {fmt.Scanf("%c", &op)}// 最长12位,但是字符串可能不足12,取小m := int(math.Min(float64(len), 12))var mod, tmp int64for i := m; i >= 3; i-- {mod = int64(math.Pow10(i - 1))tmp = 0for j := 1; j < i; j++ {tmp = tmp*10 + int64(s[j]-'0')}for j := i; j <= len; j++ {tmp = tmp*10 + int64(s[j]-'0') // 循环运算,每次取模去掉最高位,再*10加上当前位为当前数字if check(tmp, op) {            // 判断答案ans = int64(math.Max(float64(ans), float64(tmp)))}tmp %= mod}}fmt.Println(ans)
}

Js

const readline = require('readline');function check(x, op) {if (op === '-') x -= N;else if (op === '*') x *= N;else if (op === '+') x += N;const number = x % 10;while (x !== 0) {if (x % 10 !== number) return false;x = Math.floor(x / 10);}return true;
}async function main() {const rl = readline.createInterface({input: process.stdin,output: process.stdout});let N = 0;let ans = -1;let len = 0;let s = '';let op = '';s = await new Promise(resolve => {rl.question('', resolve);}); // 读入字符串len = s.length;N = Number(await new Promise(resolve => {rl.question('', resolve);})); // 读入密钥数字op = await new Promise(resolve => {rl.question('', resolve);}); // 读入运算符// 滤去多余字符如'\n'等,保证运算符为+-*while (op !== '+' && op !== '-' && op !== '*') {op = await new Promise(resolve => {rl.question('', resolve);});}// 最长12位,但是字符串可能不足12,取小const m = Math.min(len, 12);let mod, tmp;for (let i = m; i >= 3; i--) {mod = Math.pow(10, i - 1);tmp = 0;for (let j = 1; j < i; j++) {tmp = tmp * 10 + parseInt(s[j]);}for (let j = i; j <= len; j++) {tmp = tmp * 10 + parseInt(s[j]); // 循环运算,每次取模去掉最高位,再*10加上当前位为当前数字if (check(tmp, op)) { // 判断答案ans = Math.max(ans, tmp);}tmp %= mod;}}console.log(ans);rl.close();
}main();

题目内容均收集自互联网,如如若此项内容侵犯了原著者的合法权益,可联系我: (CSDN网站注册用户名: 塔子哥学算法) 进行删除。

相关文章:

【备战秋招】每日一题:2023.05.10-华为OD机试(第二题)-解密

为了更好的阅读体检&#xff0c;可以查看我的算法学习博客 在线评测链接:P1307 题目内容 在全球恐怖主义危机下&#xff0c;一组间谍团队接收到了来自地下工作者的一串神秘代码。这组代码可以帮助他们访问恐怖分子的服务器&#xff0c;但是他们需要先解密代码才能使用它。代…...

【华为OD机试】矩阵最大值(python, java, c++, js)

矩阵最大值 前言:本专栏将持续更新华为OD机试题目,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你。关于OD机试流程、面经、面试指导等,如有任何疑问,欢迎联系我,wechat:steven_moda;email:nansun0903@163.com;备注:CSDN。 题目描述 给定…...

通过USB和wifi连接真机编写第一个脚本

目录 一、连接手机 1、通过usb数据线连接手机 2、无线连接手机 二、编写第一个脚本 一、连接手机 1、通过usb数据线连接手机 数据线连接手机并允许调试 cmd命令行执行&#xff1a; adb devices 如果没有显示device信息&#xff0c;请检查&#xff1a; 手机是否开启usb调…...

【javascript】 javascript对象函数 总结

Object.entries( ) 作用&#xff1a;返回一个数组&#xff0c;获取对象所有可枚举属性的名称 和 可枚举属性的值 const obj { a: 1, b: 2 }; const entries Object.entries(obj); console.log(entries); // [[a, 1], [b, 2]] Object.keys( ) 作用&#xff1a;返回一个数组…...

LVS+Keepalived 高可用群集实战部署

LVSKeepalived 高可用群集实战部署 一、Keepalived的概念1、LVS2、Keepalived及其工作原理3、Keepalived体系主要模块及其作用4、VRRP协议&#xff08;虚拟路由冗余协议&#xff09; 二、LVSKeepalived 高可用群集部署LVS 部署1.配置负载调度器&#xff08;主、备相同&#xff…...

MCU启动过程

启动文件 启动文件到底什么作用&#xff0c;其实启动文件主要是进行堆栈之类的初始化&#xff0c; 中断向量表以及中断函数定义。启动文件要引导进入main 函数。 开发STM32F103用的启动文件是startup_stm32f10x_hd.s S32K146使用的启动文件是startup_S32K146.S 芯片架构 STM…...

Mysql 5.6使用配置文件my.ini来设置长时间连接数据库

对于已经安装了mysql和未安装都是同样的步骤。在C:\Program Files (x86)\MySQL\MySQL Server 5.6下生成一个my.ini文件。然后删除或者修改my-default.ini的名字。 一、my.ini配置文件如下 [mysqld] basedirC:\Program Files (x86)\MySQL\MySQL Server 5.6 datadirC:\Program F…...

改进YOLOv5/YOLOv8:复现结合即插即用 | 高效多尺度注意力(EMA),模块成为YOLOv5改进的小帮手

高效多尺度注意力(EMA) 论文介绍简介EMA模块图像分类实验目标检测实验yolov5加入方法yolo注册yaml文件yolov8加入方法EMA代码及加入方式yaml文件1EMA注意力论文 https://arxiv.org/ftp/arxiv/papers/2305/2305.13563.pdf 论文介绍 通道或空间的显著有效性 注意机制对产生更多…...

图像色彩增强论文调研

阅读论文 Deep Symmetric Network for Underexposed Image Enhancement with Recurrent Attentional Learning(ICCV2021) 使用对称编码器和解码器学习图像从低曝光转化到正常图片的映射方式&#xff0c;通过IFT&#xff08;Invertible Feature Transformer&#xff09;网络和提…...

ORACLE透明网关ODBC连接MYSQL

客户需求oracle访问mysql数据&#xff0c;客户是linux7.3 11.2.0.4单实例&#xff0c;字符集GBK&#xff0c;mysql是5.7.31&#xff0c;字符集UTF8&#xff0c;下面结合网上的文档和自己的实践&#xff0c;配置过程如下 1.安装oracle透明网关 首先在oracle服务器上面安装ora…...

Flutter网络请求框架Dio源码分析以及封装(二)--Cookie管理分析

Flutter网络请求框架Dio源码分析以及封装--Cookie管理分析 前言问题如何使用CookieJarCookieManagerPersistCookieJar总结 前言 上一篇文章我们简单分析了一下Dio发出请求时的大致工作流程&#xff0c;这个只是Dio最基本的功能&#xff0c;而且我们还没有分析走到httpClientA…...

Unity如何设计一个技能系统

一、技能系统的设计思路 技能系统是游戏中非常重要的一部分&#xff0c;因此在设计技能系统时需要考虑以下几个方面&#xff1a; 对啦&#xff01;这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白&#xff0c;也有一些正在从事游戏开发的技术大佬&#xff0…...

测试流程体系

目录&#xff1a; 软件测试基本概念软件测试模型软件测试工作流程测试左移和测试右移 1.软件测试基本概念 通过手工或者工具对"被测对象"进行测试验证实际结果与预期结果之间是否存在差异 软件测试作用 通过测试工作可以发现并修复软件当中存在的缺陷&#xff…...

Linux下CentOS KVM 虚拟化

介绍&#xff1a; KVM&#xff08;Kernel-based Virtual Machine&#xff09;是一种开源的虚拟化技术&#xff0c;它是基于Linux内核的虚拟化解决方案。KVM可以将一台物理服务器分割成多个虚拟机&#xff0c;每个虚拟机都可以运行不同的操作系统和应用程序&#xff0c;从而实现…...

< vue + ElementUi 组件封装:实现弹窗展示富文本数据,允许全文搜索高亮显示搜索内容 >

实现弹窗展示富文本数据&#xff0c;允许全文搜索高亮显示搜索内容 &#x1f449; 前言&#x1f449; 一、效果演示&#x1f449; 二、实现思路&#x1f449; 三、实现案例&#x1f44d; 卷王必胜&#xff01;往期内容 &#x1f4a8; &#x1f449; 前言 在 Vue elementUi 开…...

MATLAB 之 低层绘图操作和光照及材质处理

这里写目录标题 一、低层绘图操作1. 曲线对象2. 曲面对象3. 文本对象4. 其他核心对象4.1 区域块对象4.2 方框对象 二、光照和材质处理1. 光照处理2. 材质处理2.1 图形对象的反射特性2.2 material 函数 一、低层绘图操作 MATLAB 将曲线、曲面、文本等图形均视为对象&#xff0c…...

LLM-Client一个轻量级的LLM集成工具

大型语言模型(llm)已经彻底改变了我们与文本交互的方式&#xff0c;OpenAI、Google、AI21、HuggingfaceHub、Anthropic和众多开源模型提供了不同的功能和优势。但是每个模型都有其独特的体系结构、api和兼容性需求&#xff0c;集成这些模型是一项耗时且具有挑战性的任务。 所以…...

leetcode动态数组vector实现杨辉三角

链接: leetcode动态数组vector实现杨辉三角 由题意可易得&#xff0c;从第三行开始&#xff0c;除了开始和末尾的位置上的元素&#xff0c;其余位置上的元素都是由上方的元素以及上方左侧的元素相加得到的&#xff0c;此时就很容易的到从第三行开始状态转移方程为vv[i][j] vv[…...

第二十三章_Redis高性能设计之epoll和IO多路复用深度解析

before 多路复用要解决的问题 并发多客户端连接&#xff0c;在多路复用之前最简单和典型的方案&#xff1a;同步阻塞网络IO模型 这种模式的特点就是用一个进程来处理一个网络连接(一个用户请求)&#xff0c;比如一段典型的示例代码如下。 直接调用 recv 函数从一个 socket 上读…...

基于OpenCV-车辆检测项目(简易版)

车辆检测 1.项目介绍2. 读取一段视频3.通过形态学处理识别车辆4.描画轮廓5. 车辆计数并显示 本项目使用的视频地址链接 1.项目介绍 对一个视频进行车辆数量的检测&#xff0c;用到的知识有视频的读取&#xff0c;滤波器&#xff0c;形态学&#xff0c;添加直线、文本&#xff…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...