C语言刷题笔记:序列操作(增加删除去重合并)
Posted 东条希尔薇
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言刷题笔记:序列操作(增加删除去重合并)相关的知识,希望对你有一定的参考价值。
目录
1.增加
有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。
输入描述:
第一行输入一个整数(0≤N≤50)。
第二行输入N个升序排列的整数,输入用空格分隔的N个整数。
第三行输入想要进行插入的一个整数。
输出描述:
输出为一行,N+1个有序排列的整数。
输入:
5 1 6 9 22 30 8
输出:
1 6 8 9 22 30
思路及源代码展示
原数组:
1 | 6 | 9 | 22 | 30 |
记得要跟输入数组相比多一个位置,方便腾出位置给增加的元素
第一次遍历后的结果(此时待增加的元素比正在被遍历的元素小)
1 | 6 | 9 | 22 | 30 |
第二次
1 | 6 | 9 | 22 | 30 |
一直这样下去,直到遍历到比待增加的数小为止,此时就能把待增加的数加在它的前面
1 | 6 | 9 | 22 | 30 |
1 | 6 | 8 | 9 | 22 | 30 |
以下是源代码:
#include<stdio.h>
int main()
{
int n=0;
int arr[51]={0};
int i=0;
int ad=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
scanf("%d",&ad);
//以上是输入准备工作
//下面开始增加元素-----------------------------------------------------------
//思路,从数组的最后开始遍历,每一个数字与要增加的元素进行比较,若比其大,则这个数字往
//数组后面移动一位,为增加的元素腾出位置。直到数组元素不比增加的数字大
//增加的数字自动加在那一个位置
for(i=n;i>0;i--)
{
if(arr[i-1]>ad)
{
arr[i]=arr[i-1];
}
else
{
arr[i]=ad;
break;
}
}
//以下是数组已经是顺序排列的情况--------------------------------------------------
if(i==0)
{
arr[0]=ad;
}
//最后打印出来--------------------------------------------------------------
for(i=0;i<n+1;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
2.删除
描述
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。
输入描述:
第一行输入一个整数(0≤N≤50)。
第二行输入N个整数,输入用空格分隔的N个整数。
第三行输入想要进行删除的一个整数。
输出描述:
输出为一行,删除指定数字之后的序列。
输入:
6 1 2 3 4 5 9 4
输出:
1 2 3 5 9
思路及源代码展示
首先给出一个数组和一个待删除的数字
原数组(待删除的数字为4)
i | 0 | 1 | 2 | 3 | 4 | 5 |
arr[i] | 1 | 2 | 3 | 4 | 5 | 9 |
我们考虑引入一个变量j,在i遍历数组的同时,将更新后的数组存放在j中
例如,现在已经遍历到arr[3]了
i | 0 | 1 | 2 | 3 | 4 | 5 |
arr[i] | 1 | 2 | 3 | 4 | 5 | 9 |
j | 0 | 1 | 2 | |||
arr[j] | 1 | 2 | 3 |
此时,通过if条件判断,将4跳过
i | 0 | 1 | 2 | 3 | 4 | 5 |
arr[i] | 1 | 2 | 3 | 4 | 5 | 9 |
j | 0 | 1 | 2 | 3 | ||
arr[j] | 1 | 2 | 3 | 5 |
然后继续往下,可以编出我们的程序
#include<stdio.h>
int main()
{
int n=0;
int arr[50]={0};
int i=0;
int del=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
scanf("%d",&del);
//以上是准备工作
//接下来开始删除数字-------------------------------------------------------
int j=0;
for(i=0;i<n;i++)
{
if(arr[i]!=del)
{
arr[j++]=arr[i];
}
}
for(i=0;i<j;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
3.去重
描述
输入n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的整数,只保留该数第一次出现的位置,删除其余位置。
输入描述:
输入包含两行,第一行包含一个正整数n(1 ≤ n ≤ 1000),表示第二行序列中数字的个数;第二行包含n个整数(范围1~5000),用空格分隔。
输出描述:
输出为一行,按照输入的顺序输出去重之后的数字,用空格分隔。
示例1
输入:
5 10 12 93 12 75
输出:
10 12 93 75
思路及源代码展示
给定的数组
10 | 12 | 93 | 12 | 75 |
要求删除其中一个12
首先,给出查找办法
使用i遍历数组,再使用j遍历arr[i]后面的元素,查找arr[i]后面的所有元素与arr[i]是否相同。
例如,现在找到了相同的元素
i | ||||
10 | 12 | 93 | 12 | 75 |
j |
然后开始删除,删除方法可以参考本篇目第二大点
i | ||||
10 | 12 | 93 | 75 |
但如果是这样呢?
1 | 2 | 3 | 3 | 3 | 4 | 6 |
请参照代码
#include<stdio.h>
int main()
{
int n=0;
int i=0;
scanf("%d",&n);
int arr[1000]={0};
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
//以上是准备工作
//下面开始去重操作-------------------------------------
for(i=0;i<n;i++)
{
int j=0;
for(j=i+1;j<n;j++)//开始遍历数组元素,并将当前元素后面的每一个元素作比较
{
if(arr[i]==arr[j])
{
int k=0;//数组删除操作,参加本篇目第二大点
for(k=j;k<n-1;k++)
{
arr[k]=arr[k+1];
}
n--;//此时去重了一次,数组元素已经减少了一个
j--;//防止此种情况出现:1 2 3 3 3 4 6 7.而导致第三个3无法被删除
}
}
}
for(i=0;i<n;i++)
{
printf("%d ",arr[i]);
}
return 0;
}
4.合并
描述
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
输入描述:
输入包含三行,
第一行包含两个正整数n, m(1 ≤ n,m ≤ 100),用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数(范围1~5000),用空格分隔。
第三行包含m个整数(范围1~5000),用空格分隔。输出描述:
输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。
示例1
输入:
5 6 1 3 7 9 22 2 8 10 17 33 44
输出:
1 2 3 7 8 9 10 17 22 33 44
思路及源代码展示
现在有两个数组
1 | 3 | 7 | 9 | 22 |
2 | 8 | 10 | 17 | 33 | 44 | 66 |
老套路引入变量i,j分别遍历两个数组
在遍历过程中,分别将arr1[i]和arr2[j]作比较,若前者比后者小,则输出前者,同时i++,下一个数字继续比较
i | ||||||
1 | 3 | 7 | 9 | 22 | ||
j | ||||||
2 | 8 | 10 | 17 | 33 | 44 | 66 |
例如上面的情况,已经输出了1,2,现在需要执行j++操作。
后续操作参见代码注释
#include<stdio.h>
int main()
{
int n=0;
int m=0;
int i=0;
int j=0;
int arr1[100]={0};
int arr2[100]={0};
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
{
scanf("%d",&arr1[i]);
}
for(i=0;i<m;i++)
{
scanf("%d",&arr2[i]);
}
i=0;
//准备工作分界线————————————————————————————————————————————————————-
while(i<n&&j<m)//此题已经降低了难度,输入已经是升序序列,所以当一个数组遍历完后,剩下数组直接输出即可
{
if(arr1[i]<arr2[j])
{
printf("%d ",arr1[i]);
i++;
}
else
{
printf("%d ",arr2[j]);
j++;
}
}
if(i==n)//下面的代码都是为了将未遍历的元素输出
{
for(;j<m;j++)
{
printf("%d ",arr2[j]);
}
}
else
{
for(;i<n;i++)
{
printf("%d ",arr1[i]);
}
}
return 0;
}
以上是关于C语言刷题笔记:序列操作(增加删除去重合并)的主要内容,如果未能解决你的问题,请参考以下文章