从数组循环左移问题中浅谈考研算法设计的规范代码

问题:设将n(n>1)个整数存放到一维数组R中。设计一个算法,将R中的序列循环左移p(0<p<n)个位置,即将R中的数据由{X0,X1,...,Xn-1}变换为{Xp,Xp+1,...,Xn-1,X0,X1,...,Xp-1}。要求:写出本题的算法描述。

分析:

本题不难,要实现R中序列循环左移p个位置,只需先将R中前p个元素逆置,再将剩下的元素逆置,最后整体逆置操作即可。本题算法描述如下:

 1 #include <iostream>
 2 using namespace std;
 3 #define MAX 100
 4 void Nizhi(int R[],int m,int n)//对从m到n之间的元素进行逆置操作
 5 {
 6     int temp;
 7     for (int i=m,int j=n;i<j;++i,--j){
 8         temp=R[i];
 9         R[i]=R[j];
10         R[j]=temp;
11     }
12 }
13 void Diaoyong(int R[],int n,int p){//调用逆置操作的函数
14     if (p<=0||p>=n)//判断左移的个数是否合理
15         cout<<"ERROR"<<endl;
16     else
17     {
18         Nizhi(R,0,p-1);//从R[0]到R[p-1]之间的元素进行逆置操作
19         Nizhi(R,p,n-1);//从R[p]到R[n-1]之间的元素进行逆置操作
20         Nizhi(R,0,n-1);//从R[0]到R[n-1]之间的元素进行逆置操作
21     }
22 }
23 int main(void)
24 {
25     int n,p;
26     int R[MAX];
27     cin>>p;//输入左移的位数
28     cin>>n;//输入总共元素的个数
29     for (int i=0;i<n;i++)//对数组进行初始化
30         cin>>R[i];
31     Diaoyong(R,n,p);//调用函数
32     for (int i=0;i<n;i++)
33         cout<<R[i]<<" ";//对左移p个位置的数组R进行输出
34     cout<<endl;
35     return 0;
36 }

以上程序是一段完整的可在编译器下运行的程序,如果对于考生答卷,在试卷上给出算法的描述,完全没有必要这么写,对于研究生选拔性考试,只需要写出函数的说明,给出函数的接口即可,阅卷老师就会知道你已经做好了解决这个问题的工具(函数),并且说明了工具的使用方法(接口)。因此,我们只需要给出第4行到22行的代码,这样显然简洁了很多。

void Nizhi(int R[],int m,int n)//对从m到n之间的元素进行逆置操作
{
	int temp;
	for (int i=m,int j=n;i<j;++i,--j){
		temp=R[i];
		R[i]=R[j];
		R[j]=temp;
	}
}
void Diaoyong(int R[],int n,int p){//调用逆置操作的函数
	if (p<=0||p>=n)//判断左移的个数是否合理
		cout<<"ERROR"<<endl;
	else
	{
		Nizhi(R,0,p-1);//从R[0]到R[p-1]之间的元素进行逆置操作
		Nizhi(R,p,n-1);//从R[p]到R[n-1]之间的元素进行逆置操作
		Nizhi(R,0,n-1);//从R[0]到R[n-1]之间的元素进行逆置操作
	}
}

通过以上说明,可以把接口理解为用户和函数打交道的地方,通过接口,用户输入了自己的数据,得到了想要的结果

至此,我们可以知道考研综合应用中算法设计题中的代码部分重点需要写那些内容了,即只需写出一个或多个可以解决此问题的有着清楚接口描述的函数即可。

时间: 2024-12-17 23:35:11

从数组循环左移问题中浅谈考研算法设计的规范代码的相关文章

《编程珠玑》笔记:数组循环左移

问题描述:数组元素循环左移,将包含 num_elem 个元素的一维数组 arr[num_elem] 循环左移 rot_dist 位.能否仅使用数十个额外字节的存储空间,在正比于num_elem的时间内完成数组的旋转? 一:Bentley's Juggling Alogrithm 移动变量 arr[0] 到临时变量 tmp,移动 arr[rot_dist] 到 arr[0],arr[2rot_dist] 到 arr[rot_dist],依此类推,直到返回到取 arr[0] 中的元素,此时改为从 t

在Objective-C中浅谈面向对象

接触面向对象也有一段时间了,当时是通过C++学习的OOP,后来又接触到了PHP和Java.每种OOP的语言在面向对象上或多或少都会有不同的地方,现在在学习OC的面向对象部分,又感觉到OC面向对象的特点.写篇博文总结一下OC中的面向对象.刚接触OC,用OC中的便利初始化方法和便利构造器有点蹩脚,不过还可以在接受的范围之内,以下的东西可能会对面向对象的特征:抽象,封装,继承等总结的较少一些,主要总结了OC中面向对象的特点.在用到便利构造器的时候,如果之前学习过设计模式的话会好理解一些. 在下面的代码

浅谈分词算法(1)分词中的基本问题

[TOC] 前言 分词或说切词是自然语言处理中一个经典且基础的问题,在平时的工作中也反复的接触到分词问题,用到了不同的模型,不同的方法应用在各个领域中,所以想对分词问题做一个系统的梳理.大多数分词问题主要是针对类似汉语.韩语.日语等,词语之间并没有天然的分割,而像英语等,句子中是带有天然的分割的.但是英语也会涉及到分词问题,比如实体识别.词性标注等内容.而本系列文章更多的是讨论汉语中的分词问题,首先我们从分词问题的基本出发,之后从传统的词典分词到将分词转为序列标注问题的分词,以及最新的结合深度学

hdu1875浅谈prim算法的朴素实现

阅读原题 题目大意 给你几个(<=100)小岛的坐标,然后你把所有的岛都修上桥连接起来,求最小花费,还有个附加的限制:只有岛之间的距离大于等于10,或小于等于1000时才能修桥. 大概是因为十米以内不用建桥,千米以上无法建桥.哈哈,说着玩的. 很明显这是一道MST(最小生成树)的题目,貌似也有人用并查集AC过. 最小生成树算法 概述 最小生成树的常用算法有两个kruskal和prim算法.两者都是不停地执行归并操作,然而一言以蔽之,两者的不同之处在于:kruskal----归并边:prim---

浅谈 JavaScript 编程语言的编码规范

对于熟悉 C/C++ 或 Java 语言的工程师来说,JavaScript 显得灵活,简单易懂,对代码的格式的要求也相对松散.很容易学习,并运用到自己的代码中.也正因为这样,JavaScript 的编码规范也往往被轻视,开发过程中修修补补,最终也就演变成为后续维护人员的恶梦.软件存在的长期价值直接与编码的质量成比例.编码规范能帮助我们降低编程中不必要的麻烦.而 JavaScript 代码是直接发送给客户浏览器的,直接与客户见面,编码的质量更应该受到关注. 本文浅谈 JavaScript 编程中关

浅谈商城活动设计

如题:浅谈商城活动设计 标题改成“浅谈商城活动的数据库设计”可能更加合理. 文章背景 为什么要吐槽,为什么要写这篇文章 本来我在弄大数据搜索,自己玩的不亦说乎,虽然感觉数据库设计不合理,但我可以数据清洗,弄到自己的搜索引擎里,自己随便玩,所以当时感觉在烂的数据库设计和我关系不大,只要我把数据清洗好,弄到自己的引擎里我的搜索正常,准确,问题不大.但忽然有一天老大跑来说ERP对接需要你来lead一下,然后一两个月带着捣乱的产品妹妹,和没有经验开发弟弟搞了ERP的简单对接,然后老大又说咱们商城库存总有

浅谈分词算法(2)基于词典的分词方法

[TOC] 前言 在浅谈分词算法(1)分词中的基本问题中我们探讨了分词中的基本问题,也提到了基于词典的分词方法.基于词典的分词方法是一种比较传统的方式,这类分词方法有很多,如:正向最大匹配(forward maximum matching method, FMM).逆向最大匹配(backward maximum matching method,BMM).双向扫描法.逐词遍历法.N-最短路径方法以及基于词的n-gram语法模型的分词方法等等.对于这类方法,词典的整理选择在其中占到了很重要的作用,本

浅谈欧洲算法——模拟退火

初听说退火这个名词感觉就很(zhuang)帅(A__CDEFG...) 直到学了退火之后,我才发现: 退火不只是帅,而且非常万能 甚至比 D (大) F (法) S (师)还要万能 简直就是骗(de)分神器啊 简介 作为一个计算机算法,它竟然在百度上有物理词条! 当时我看了就懵了,你说计算机一个算法,跟冶炼金属有什么关系啊? 后来我看了算法的词条... 是不是更懵了... 方便大家理解(变得更懵),我搬了百度上的定义: Simulate Anneal Arithmetic (SAA,模拟退火算法

浅谈KMP算法及其next[]数组

KMP算法是众多优秀的模式串匹配算法中较早诞生的一个,也是相对最为人所知的一个. 算法实现简单,运行效率高,时间复杂度为O(n+m)(n和m分别为目标串和模式串的长度),比蛮力算法的O(nm)快了许多. 理解KMP算法,关键是理解其中的精髓——next[]数组. (统一起见,下文将目标字符串记作obj,将模式字符串记作pattern,这与后面的程序代码是一致的) 我们给一个字符串S定义一个next值,记作next(S),next(S)=n表示: (1)S的前n个字符构成的前缀,和后n个字符的后缀