栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

数据结构线性表操作之 //左移K个元素 //合并两个单增序列为一个单增/减序列(C++代码实现)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

数据结构线性表操作之 //左移K个元素 //合并两个单增序列为一个单增/减序列(C++代码实现)

这是本人第一次发博客,如有建议与批评,请各位观众老爷多加指正,发博客的目的是为了及时记录所学的内容,方面之后回顾。

上完数据结构课程,老师布置了三个作业,这里来进行问题的解决。

一.左移K个元素

1.问题描述:

将一个数组的前k个元素左移,移到尾部。

2.问题分析:

举个例子,数组:1,2,3,4,5,6,7; 左移3个元素则变为:4,5,6,7,1,2,3;与反转问题类似,反转后,前k个元素之间的顺序没有发生变化,后n-k个元素之间的顺序也没有发生变化,因此,可以把数组分为两个部分,前k个元素为一个部分(这里简记为块1),后n-k个元素为另一个部分(这里简记为块2),所以该问题实质为将两个数组块进行反转。

  但是,我们平时使用的反转都是将两个元素之间进行反转,并没有涉及到整体的反转。那么,我们怎样才能将整体进行反转呢?

我们都知道负负得正,那么可以拓展到,一个数组反转两次最后得到的还是原来的数组,我们利用这个思路,可以先将块1进行一次反转,将块2进行一次反转,最后将两个块,也就是整个数组进行反转,这样一来,既实现了两个块之间的反转,又使得块内元素的顺序没有发生变化。

3.代码实现

void reverse (int a[],int from,int to) {//简单反转函数
for (int i = 0;i < (to - from)/2;i++) {
int tmp = a[from + i];
a[from + i] = a[to - i];
a[to - i] = tmp;
}
}
void removeK (int a[],int n,int k) {
reverse(a,0,k-1);//将前K个元素反转
reverse(a,k,n-1);//将后n-k个元素反转
reverse(a,0.n-1);//将整个数组反转
for (int i = 0;i < n;i++) {//输出结果
cout<
二.合并两个单增序列为一个单增序列

问题描述:合并两个单增序列为一个单增序列(并不是严格单调)

问题分析:举个例子,数组a:1,3,5;数组b:2,4,6;合并结果为:1,2,3,4,5,6;

依次遍历两个数组,1小于2,把1放入,接着比较3和2,2小于3,把2放入,以此类推,可以看出,该问题的实质为比较+插入。

代码实现:

void combine1(int a[],int b[],int na,int nb) {
int *c = new int[na + nb];//创建数组来存放结果
int i = 0;//遍历a的指针,把表示下标的变量叫做指针,但它并不是实际意义上的指针
int j = 0;//遍历b的指针
int k = 0;//遍历c的指针
while (i < na && j < nb) {//i和j中,若有一方遍历到数组最后一个了,则退出,关于是否需要“=”,这里是小细节问题,可以自行检测一下
if (a[i] <= b[j]) {//a当前元素小于b的,则把a的放入,放入后a的指针移向下一个元素
c[k++] = a[i++];
}else {
c[k++] = b[j++];//否则把b的放入
}
}
while (i <= na) {//a的元素没有遍历完,所以把a剩下的元素继续往进放
c[k++] = a[i++];
}
while (j <= nb) {//同理,b也一样
c[k++] = b[j++];
}
for (int i = 0;i < na + nb;i++) {//输出结果
cout< 
三. 合并两个单增序列为一个单减序列 

问题描述:合并两个单增序列为一个单减序列(并不是严格单调)。

问题分析:不出意外的话,这是问题二的孪生兄弟,由于考虑到结果是单减序列,要求元素从大到小排,而原始数组是从小到大排的,我们不妨对问题二的思路进行翻转,遍历数组时从后往前,这样就可以使大的元素放到最前面了。

代码实现:

void combine2(int a[],int b[],int na, int nb) {
int *ans = new int[na + nb];
int i = na - 1;//从后往前遍历
int j = nb - 1;
int k = 0;//从前往后放
while (i >= 0 && j >= 0) {//注意细节,因为i是可以取到0值的,所以有等号,上个问题中,因为i是不可以取到na值的(越界),所以没有等号
if (a[i] >= b[j]) {
ans[k++] = a[i++];
}else {
ans[k++] = b[j++];
}
}
while (i >= 0) {
ans[k++] = a[i++];
}
while (j >= 0) {
ans[k++] = b[j++];
}
for (int i = 0;i < na + nb;i++) {
cout<

第一写博客不知道怎么调这里的代码格式,导致代码不是很整齐,各位多包涵!有需要改进的地方欢迎大家一起来分享! 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/767933.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号