复习枚举1------重新排列后能否得到目标数组

问题1:题干描述

     

题目描述

给定两个数组,判断第二个数组能否经过排序得到得第一个数组。

输入输出格式

输入格式 第一行输入一个数字,表示两个数组的大小。 接下来两行,输入相应个数的整数,每个整数之间用一个空格隔开。 输出格式 输出数字011表示能经过排序后得到第一个数组,0表示不能。

输入输出样例1

输入 4

0 1 2 3

3 2 1 0

输出 1

输入输出样例2

输入 4

1 1 0 1

1 1 1 1

输出 0

2.问题分析:

        我们可以定义两个初始值都为0的数组,然后使用两次for循环,外部循环执行两次,内部循环执行n次,这样就能对两个数组进行赋值,但是我们要保存的数据却不是我们输入的数据,而是它们在各个数组中出现的次数,还记得我们之前讲过的桶排序吗,道理是一样的,将输入的数据作为数组的下标,使得对应的位置自增1,最后遍历两个数组,看内部数据是否相同即可。

3.具体代码:

       

#include<stdio.h>

int main(void)

{

    int n;

    int arr_1[20] = { 0 };

    int arr_2[20] = { 0 };

    int flag = 1;

    scanf("%d",&n);

    for(int i = 2;i>0;i--)

        for (int j = 0; j < n; j++)//通过i的值分别对两个数组进行赋值

        {

            int c;

            scanf("%d", &c);

            if (i == 2)

                arr_1[c]++;

            else

                arr_2[c]++;

        }//c出现一次则相应位置自增1

    for(int i = 0;i<20;i++)

        if (arr_1[i] != arr_2[i])//如果两数组对应位置不相等则flag = 0,退出循环。

        {

            flag = 0;

            break;

        }

    if (flag)

        printf("1");

    else

        printf("0");

    return 0;

}

 

4.注释:

        由于这段代码只起到演示作用,所以数组能接受的下标最大只有19,如果数据过大会十分浪费空间,这种写法目的只是为了让大家复习下枚举,实际上这道题更适合使用之前提到的排序算法来解决(非桶排序),就当作课后作业交给同学们来处理了。      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值