7-1 数组循环左移 (20 分)

时间: 2023-11-27 13:06:01 浏览: 146
这个问题是一个编程题目,要求实现一个将数组循环左移k位的函数。 具体实现方法可以是:先将前k个数字翻转,再将后面的数字翻转,最后将整个数组翻转。 以下是一个C++的实现示例: ```cpp void reverse(int nums[], int start, int end) { while (start < end) { int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; start++; end--; } } void rotate(int nums[], int n, int k) { k = k % n; reverse(nums, 0, k - 1); reverse(nums, k, n - 1); reverse(nums, 0, n - 1); } ``` 其中,reverse函数用于翻转数组中的一段区间,rotate函数用于实现数组循环左移。
相关问题

7-2 数组循环左移(20分)(顺序表实现)

题目描述: 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移M(M>=0)个位置,即将A中的数据由(A0 A1……AN-1)变换为(AM AM+1……AN-1 A0 A1……AM-1)(最前面的M个数变为最后面的M个数,其它依次向前推),试编写程序实现上述功能,对于给定的一个数组A及其长度N,输出循环左移M位后的结果。 输入格式: 输入第1行给出正整数N(1≤N≤100)、正整数M(≤N)和一个数组A(A0 A1……AN-1),其中每个整数都在[-1000, 1000]之间。 输出格式: 在一行中输出循环左移M位后的数组A的内容,数字间以空格分隔,行末不得有多余空格。 输入样例: 6 2 1 2 3 4 5 6 输出样例: 3 4 5 6 1 2 解题思路: 可以用顺序表来实现。首先将前M个数逆序,将后N-M个数逆序,再将整个数组逆序即可。 C++代码实现: ```cpp #include <iostream> #include <vector> using namespace std; int main() { int n, m; cin >> n >> m; vector<int> v(n); for (int i = 0; i < n; i ++ ) cin >> v[i]; reverse(v.begin(), v.begin() + m); reverse(v.begin() + m, v.end()); reverse(v.begin(), v.end()); for (int i = 0; i < n; i ++ ) cout << v[i] << (i == n - 1 ? "\n" : " "); return 0; } ```

masm汇编语言实现 将一个指定字符串进行循环移位加密。每个单字符的密钥(-7~7)保存在数组Key中。程序运行过程:显示明文,显示所产生的密文,显示解密后的明文。例如key = {-2,2,1,0,-1},其中负数表示循环左移,正数表示循环右移,0不变,数字表示移动的位数。 模板 DATAS SEGMENT ;此处输入数据段代码 DATAS ENDS STACKS SEGMENT ;此处输入堆栈段代码 STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS START: MOV AX,DATAS MOV DS,AX ;此处输入代码段代码 MOV AH,4CH INT 21H CODES ENDS END START

以下是使用 MASM 汇编语言实现将指定字符串进行循环移位加密的代码,包括显示明文、密文和解密后的明文: ``` DATAS SEGMENT ; 数据段定义 MAX_LEN EQU 100 ; 字符串最大长度 STR DB MAX_LEN DUP(?) ; 存储明文、密文和解密后的明文的字符串 KEY DB -2, 2, 1, 0, -1 ; 密钥数组 DATAS ENDS STACKS SEGMENT ; 堆栈段定义 DW 100H DUP(?) ; 申请堆栈空间 STACKS ENDS CODES SEGMENT ASSUME CS:CODES, DS:DATAS, SS:STACKS START: ; 初始化堆栈指针 MOV AX, STACKS MOV SS, AX ; 显示提示信息 MOV DX, OFFSET STR MOV AH, 9 MOV DL, "P" INT 21H MOV DL, "l" INT 21H MOV DL, "e" INT 21H MOV DL, "a" INT 21H MOV DL, "s" INT 21H MOV DL, "e" INT 21H MOV DL, " " INT 21H MOV DL, "i" INT 21H MOV DL, "n" INT 21H MOV DL, "p" INT 21H MOV DL, "u" INT 21H MOV DL, "t" INT 21H MOV DL, " " INT 21H MOV DL, "s" INT 21H MOV DL, "t" INT 21H MOV DL, "r" INT 21H MOV DL, "i" INT 21H MOV DL, "n" INT 21H MOV DL, "g" INT 21H MOV DL, ":" INT 21H ; 读入明文字符串 MOV AH, 0AH MOV DX, OFFSET STR INT 21H ; 显示明文 MOV AH, 9 MOV DX, OFFSET STR+2 INT 21H ; 加密 MOV SI, OFFSET STR+2 ; SI 指向明文 MOV DI, OFFSET STR+MAX_LEN+2 ; DI 指向密文 MOV CX, 0 ; CX 计数器清零 MOV BX, 0 ; BX 存储密钥数组的偏移量 ENCRYPT_LOOP: MOV AL, [SI] ; 取出当前字符 ADD AL, [KEY+BX] ; 加上密钥 CMP AL, 0 ; 判断是否为 0 JZ ENCRYPT_SKIP ; 如果为 0,则不变 CMP AL, 7 ; 判断是否大于 7 JG ENCRYPT_OVERFLOW ; 如果大于 7,则溢出 CMP AL, -7 ; 判断是否小于 -7 JL ENCRYPT_OVERFLOW ; 如果小于 -7,则溢出 ADD BX, 1 ; 更新密钥数组的偏移量 CMP BX, 5 ; 判断是否超出密钥数组的长度 JGE ENCRYPT_RESET ; 如果超出,则重置为 0 CMP AL, 0 ; 判断是否为 0 JZ ENCRYPT_SKIP ; 如果为 0,则不变 CMP AL, 0AH ; 判断是否为换行符 JE ENCRYPT_SKIP ; 如果是换行符,则不变 CMP AL, 0DH ; 判断是否为回车符 JE ENCRYPT_SKIP ; 如果是回车符,则不变 ADD [DI], AL ; 更新密文 CMP [DI], 7FH ; 判断是否超出 ASCII 码表范围 JG ENCRYPT_OVERFLOW ; 如果超出,则溢出 CMP [DI], 20H ; 判断是否小于空格 JL ENCRYPT_OVERFLOW ; 如果小于空格,则溢出 ENCRYPT_SKIP: INC SI ; 指向下一个字符 INC DI ; 指向下一个密文 INC CX ; 计数器加 1 CMP CX, MAX_LEN ; 判断是否超出字符串最大长度 JG ENCRYPT_END ; 如果超出,则结束加密 JMP ENCRYPT_LOOP ENCRYPT_OVERFLOW: ; 显示错误信息 MOV DX, OFFSET STR MOV AH, 9 MOV DL, "E" INT 21H MOV DL, "r" INT 21H MOV DL, "r" INT 21H MOV DL, "o" INT 21H MOV DL, "r" INT 21H MOV DL, "!" INT 21H JMP ENCRYPT_END ENCRYPT_RESET: ; 重置密钥数组的偏移量为 0 XOR BX, BX JMP ENCRYPT_LOOP ENCRYPT_END: ; 显示密文 MOV AH, 9 MOV DX, OFFSET STR+MAX_LEN+2 INT 21H ; 解密 MOV SI, OFFSET STR+MAX_LEN+2 ; SI 指向密文 MOV DI, OFFSET STR+MAX_LEN*2+2 ; DI 指向解密后的明文 MOV CX, 0 ; CX 计数器清零 MOV BX, 0 ; BX 存储密钥数组的偏移量 DECRYPT_LOOP: MOV AL, [SI] ; 取出当前字符 SUB AL, [KEY+BX] ; 减去密钥 CMP AL, 0 ; 判断是否为 0 JZ DECRYPT_SKIP ; 如果为 0,则不变 CMP AL, 7 ; 判断是否大于 7 JG DECRYPT_OVERFLOW ; 如果大于 7,则溢出 CMP AL, -7 ; 判断是否小于 -7 JL DECRYPT_OVERFLOW ; 如果小于 -7,则溢出 ADD BX, 1 ; 更新密钥数组的偏移量 CMP BX, 5 ; 判断是否超出密钥数组的长度 JGE DECRYPT_RESET ; 如果超出,则重置为 0 CMP AL, 0 ; 判断是否为 0 JZ DECRYPT_SKIP ; 如果为 0,则不变 CMP AL, 0AH ; 判断是否为换行符 JE DECRYPT_SKIP ; 如果是换行符,则不变 CMP AL, 0DH ; 判断是否为回车符 JE DECRYPT_SKIP ; 如果是回车符,则不变 ADD [DI], AL ; 更新解密后的明文 CMP [DI], 7FH ; 判断是否超出 ASCII 码表范围 JG DECRYPT_OVERFLOW ; 如果超出,则溢出 CMP [DI], 20H ; 判断是否小于空格 JL DECRYPT_OVERFLOW ; 如果小于空格,则溢出 DECRYPT_SKIP: INC SI ; 指向下一个密文 INC DI ; 指向下一个解密后的明文 INC CX ; 计数器加 1 CMP CX, MAX_LEN ; 判断是否超出字符串最大长度 JG DECRYPT_END ; 如果超出,则结束解密 JMP DECRYPT_LOOP DECRYPT_OVERFLOW: ; 显示错误信息 MOV DX, OFFSET STR MOV AH, 9 MOV DL, "E" INT 21H MOV DL, "r" INT 21H MOV DL, "r" INT 21H MOV DL, "o" INT 21H MOV DL, "r" INT 21H MOV DL, "!" INT 21H JMP DECRYPT_END DECRYPT_RESET: ; 重置密钥数组的偏移量为 0 XOR BX, BX JMP DECRYPT_LOOP DECRYPT_END: ; 显示解密后的明文 MOV AH, 9 MOV DX, OFFSET STR+MAX_LEN*2+2 INT 21H ; 退出程序 MOV AH, 4CH INT 21H CODES ENDS END START ```
阅读全文

相关推荐

最新推荐

recommend-type

微机原理及应用上机考试题

双字乘以7相当于双字先左移三位(相当于乘以8),再加原数(相当于乘以1)。注意检查溢出情况,可能需要配合`JO`(进位标志为1时跳转)、`JNO`(无进位跳转)等条件跳转指令。 3. **循环控制与子程序设计**: - **...
recommend-type

2014锐捷网络校园招聘c笔试题目

17. 右移一位相当于除以2,负数右移保留符号位,因此-1右移一位仍然是-1,左移一位相当于乘以2,得到-2。 18. `sprintf`的连续调用,字符串连接后输出是`abc100efg%d`,`printf`填充100。 19. 二叉树的前序遍历和...
recommend-type

C语言 超经典 笔试题

20. 数组插入:在数组中插入元素,需要移动`n-i+1`个元素。 21-25. 算法:这部分涉及的是排序算法,具体实现未给出,通常C语言中常见的排序算法有冒泡排序、选择排序、插入排序、快速排序等。 以上内容详细解释了...
recommend-type

基于倍福EtherCAT的源码开发:主站F4/H7与从站方案,支持通信测试,含硬件电路板与芯片方案,ethercat源码,可适配倍福ethercat,可用总线plc源码开发 主站和从站方案,源码

基于倍福EtherCAT的源码开发:主站F4/H7与从站方案,支持通信测试,含硬件电路板与芯片方案,ethercat源码,可适配倍福ethercat,可用总线plc源码开发。 主站和从站方案,源码。 有,支持到测试通讯上。 主站F4方案和H7方案两种,带硬件实物电路板。 主站F4,芯片F407。 从站 ,芯片F405、F103。 ,Ethercat源码; 倍福Ethercat适配; PLC源码开发; 主站和从站方案; 测试通讯支持; 主站F4方案/H7方案; 硬件实物电路板; 芯片F407; 从站芯片F405、F103。,"EtherCAT源码:主站F4与H7方案,从站支持多种芯片,适配倍福,支持测试通讯的PLC开发方案"
recommend-type

逻辑无环流可逆直流调速系统MATLAB仿真研究与实现,逻辑无环流可逆直流调速系统matlab仿真 ,核心关键词:逻辑控制; 无环流; 可逆直流调速系统; MATLAB仿真; 调速控制; 线性电机驱

逻辑无环流可逆直流调速系统MATLAB仿真研究与实现,逻辑无环流可逆直流调速系统matlab仿真。 ,核心关键词:逻辑控制; 无环流; 可逆直流调速系统; MATLAB仿真; 调速控制; 线性电机驱动系统; 优化算法; 电气控制工程; 模型构建。,MATLAB仿真无环流可逆直流调速系统逻辑研究
recommend-type

Fortify代码扫描工具完整用户指南与安装手册

Fortify是惠普公司推出的一套应用安全测试工具,广泛应用于软件开发生命周期中,以确保软件的安全性。从给定的文件信息中,我们可以了解到相关的文档涉及Fortify的不同模块和版本5.2的使用说明。下面将对这些文档中包含的知识点进行详细说明: 1. Fortify Audit Workbench User Guide(审计工作台用户指南) 这份用户指南将会对Fortify Audit Workbench模块提供详细介绍,这是Fortify产品中用于分析静态扫描结果的界面。文档可能会包括如何使用工作台进行项目创建、任务管理、报告生成以及结果解读等方面的知识。同时,用户指南也可能会解释如何使用Fortify提供的工具来识别和管理安全风险,包括软件中可能存在的各种漏洞类型。 2. Fortify SCA Installation Guide(软件组合分析安装指南) 软件组合分析(SCA)模块是Fortify用以识别和管理开源组件安全风险的工具。安装指南将涉及详细的安装步骤、系统要求、配置以及故障排除等内容。它可能会强调对于不同操作系统和应用程序的支持情况,以及在安装过程中可能遇到的常见问题和解决方案。 3. Fortify SCA System Requirements(软件组合分析系统需求) 该文档聚焦于列出运行Fortify SCA所需的硬件和软件最低配置要求。这包括CPU、内存、硬盘空间以及操作系统等参数。了解这些需求对于确保Fortify SCA能够正常运行以及在不同的部署环境中都能提供稳定的性能至关重要。 4. Fortify SCA User Guide(软件组合分析用户指南) 用户指南将指导用户如何使用SCA模块来扫描应用程序中的开源代码组件,识别已知漏洞和许可证风险。指南中可能含有操作界面的介绍、扫描策略的设置、结果解读方法、漏洞管理流程等关键知识点。 5. Fortify SCA Utilities Guide(软件组合分析工具指南) 此文档可能详细描述了SCA模块的附加功能和辅助工具,包括命令行工具的使用方法、报告的格式化和定制选项,以及与持续集成工具的集成方法等。 6. Fortify Secure Coding Package for Visual Studio User Guide(Visual Studio安全编码包用户指南) Visual Studio安全编码包是Fortify提供给Visual Studio开发者的插件,它能够在编码阶段就帮助开发者发现和修复代码中的安全问题。这份指南将详细说明如何在Visual Studio中集成和使用这个插件,以及如何通过它的各种特性提升代码质量和安全性。 7. IntroToSCAS(软件组合分析入门) 这本入门指南可能为初学者提供一个关于SCA概念的基础理解,包括其重要性、工作原理以及如何应对软件中依赖的开源组件所带来的安全风险。 这些文档涵盖了使用Fortify进行代码安全扫描的多个方面,从安装配置到使用指导,再到深入的漏洞管理。每一个文档都为用户提供了在软件开发生命周期中提高软件安全性所需的关键知识和工具。对于IT专业人士来说,熟悉这些文档的内容将有助于他们更好地在软件开发过程中实施安全措施,以防范潜在的安全威胁。 由于文档内容的丰富性,以上知识点仅是一部分概览。对于每个模块的具体使用方法、最佳实践、案例研究以及高级功能配置等内容,都需要在阅读官方文档后才能全面掌握。IT行业中的安全专家、开发人员、测试工程师等都应根据自己的职责范围来深入学习和应用这些文档中的知识。
recommend-type

【VS2010-MFC实战秘籍】:串口数据波形显示软件入门及优化全解析

# 摘要 本文系统地探讨了基于MFC的串口数据波形显示软件的开发过程,涵盖了从理论基础到实践应用的各个方面。首先介绍了MFC串口通信的理论知识和实际操作,包括串口工作原理、参数配置及使用MFC串口类进行数据收发。随后,文章深入讲解了波形显示软件的界面设计、实现及优化策略,强调了用户
recommend-type

freesurfer完成处理后,如何批量提取每个被试aseg.stats的某个脑区的体积(volume)到一个table中,每个被试的数据是单独的一行

在Freesurfer的处理流程结束后,如果你想要从每个被试的aseg.stats文件中提取特定脑区的体积并整理成表格,你可以按照以下步骤操作: 1. **定位aseg.stats文件**:首先需要找到每个被试的aseg.stats文件,通常它们位于`fsaverage/surf/lh/label`或`rh/label`目录下,对应于左右半球,名称包含被试ID。 2. **解析数据**:打开`aseg.stats`文件,这是一个文本文件,包含了各个脑区域的信息,包括名称(比如`lh.Cuneus.volume`)和值。使用编程语言如Python或Matlab可以方便地读取和解析这个文件。
recommend-type

汽车共享使用说明书的开发与应用

根据提供的文件信息,我们可以提炼出以下知识点: 1. 文件标题为“carshare-manual”,意味着这份文件是一份关于汽车共享服务的手册。汽车共享服务是指通过互联网平台,允许多个用户共享同一辆汽车使用权的模式。这种服务一般包括了车辆的定位、预约、支付等一系列功能,目的是为了减少个人拥有私家车的数量,提倡环保出行,并且能够提高车辆的利用率。 2. 描述中提到的“Descripción 在汽车上使用说明书的共享”,表明该手册是一份共享使用说明,用于指导用户如何使用汽车共享服务。这可能涵盖了如何注册、如何预约车辆、如何解锁和启动车辆、如何支付费用等用户关心的操作流程。 3. 进一步的描述提到了“通用汽车股份公司的股份公司 手册段CarShare 埃斯特上课联合国PROYECTO desarrollado恩11.0.4版本。”,这部分信息说明了这份手册属于通用汽车公司(可能是指通用汽车股份有限公司GM)的CarShare项目。CarShare项目在11.0.4版本中被开发或更新。在IT行业中,版本号通常表示软件的迭代,其中每个数字代表不同的更新或修复的内容。例如,“11.0.4”可能意味着这是11版本的第4次更新。 4. 标签中出现了“TypeScript”,这表明在开发该手册对应的CarShare项目时使用了TypeScript语言。TypeScript是JavaScript的一个超集,它添加了类型系统和一些其他特性,使得开发大型的、可维护的应用程序变得更加容易。TypeScript编译到JavaScript,因此它是JavaScript的一个严格的语法子集。通过使用TypeScript,开发者可以利用面向对象编程的特性,如接口、泛型、类、模块等。 5. 压缩包子文件的文件名称列表中只有一个文件名“carshare-manual-master”,这表明原始的CarShare项目文件可能被压缩打包成了一个压缩文件,并且该压缩文件的名称为“carshare-manual-master”。在IT项目管理中,“master”通常指的是主分支,这个分支通常用于生产环境或是软件的稳定发布版本。这说明“carshare-manual-master”可能是CarShare项目的主分支备份,包含了手册的最新版本。 综合以上信息,我们可以得出以下结论:这份“carshare-manual”是一份由通用汽车公司开发的汽车共享服务使用手册,该服务是CarShare项目的一部分,项目开发使用了TypeScript语言,并且与之相关的一个主分支备份文件被命名为“carshare-manual-master”。用户可以通过这份手册了解如何使用CarShare服务,包括注册、预约、使用和支付等环节,以便更好地享受汽车共享带来的便捷和环保出行理念。
recommend-type

BD3201电路维修全攻略:从入门到高级技巧的必备指南

# 摘要 本文系统地介绍了BD3201电路的维修流程和理论知识,旨在为相关技术人员提供全面的维修指导。首先概述了BD3201电路维修的基本概念,接着深入探讨了电路的基础理论,包括电路工作原理、电路图解读及故障分析基础。第三章详细描述了维修实践操作,涵盖了从准备工作到常见故障诊断与修复,以及性能测试与优化的完整过程。第四章提出了BD3201电路高级维修技巧,强调了微电子组件的焊接拆卸技术及高