问题1:题干描述
题目描述
给定两个数组,判断第二个数组能否经过排序得到得第一个数组。
输入输出格式
输入格式 第一行输入一个数字,表示两个数组的大小。 接下来两行,输入相应个数的整数,每个整数之间用一个空格隔开。 输出格式 输出数字0
或1
,1
表示能经过排序后得到第一个数组,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,如果数据过大会十分浪费空间,这种写法目的只是为了让大家复习下枚举,实际上这道题更适合使用之前提到的排序算法来解决(非桶排序),就当作课后作业交给同学们来处理了。