C语言刷题笔记:序列操作(增加删除去重合并)

Posted 东条希尔薇

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言刷题笔记:序列操作(增加删除去重合并)相关的知识,希望对你有一定的参考价值。

目录

1.增加 

输入描述:

输出描述:

思路及源代码展示

2.删除 

描述

输入描述:

输出描述:

思路及源代码展示 

3.去重

描述

输入描述:

输出描述:

示例1

思路及源代码展示 

4.合并

描述

输入描述:

输出描述:

示例1

 思路及源代码展示 


1.增加 

有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。

输入描述:

第一行输入一个整数(0≤N≤50)。

第二行输入N个升序排列的整数,输入用空格分隔的N个整数。

第三行输入想要进行插入的一个整数。

输出描述:

输出为一行,N+1个有序排列的整数。

输入:

5
1 6 9 22 30
8

输出:

1 6 8 9 22 30

思路及源代码展示

原数组:

1692230

记得要跟输入数组相比多一个位置,方便腾出位置给增加的元素

第一次遍历后的结果(此时待增加的元素比正在被遍历的元素小)

1692230

第二次

1692230

一直这样下去,直到遍历到比待增加的数小为止,此时就能把待增加的数加在它的前面

1692230

16892230

以下是源代码:

#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)

i012345
arr[i]123459

我们考虑引入一个变量j,在i遍历数组的同时,将更新后的数组存放在j中

例如,现在已经遍历到arr[3]了

i012345
arr[i]123459
j012
arr[j]123

此时,通过if条件判断,将4跳过

i012345
arr[i]123459
j0123
arr[j]1235

然后继续往下,可以编出我们的程序

#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

思路及源代码展示 

给定的数组

1012931275

要求删除其中一个12

首先,给出查找办法

使用i遍历数组,再使用j遍历arr[i]后面的元素,查找arr[i]后面的所有元素与arr[i]是否相同。

例如,现在找到了相同的元素

i
1012931275
j

然后开始删除,删除方法可以参考本篇目第二大点

i
10129375

但如果是这样呢?

1233346

请参照代码

#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

 思路及源代码展示 

现在有两个数组

137922

281017334466

老套路引入变量i,j分别遍历两个数组

在遍历过程中,分别将arr1[i]和arr2[j]作比较,若前者比后者小,则输出前者,同时i++,下一个数字继续比较

i
137922
j
281017334466

例如上面的情况,已经输出了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语言刷题笔记:序列操作(增加删除去重合并)的主要内容,如果未能解决你的问题,请参考以下文章

c语言学生成绩管理系统

2019.8.7刷题统计

C语言之牛客网刷题笔记 点进来保证让知识充实你一整天

leetcode刷题分类笔记

《C程序设计语言》笔记 (十四) 参考手册6

LeetCode刷题笔记-数据结构-day5