那些让我绞尽脑汁的 数组例题

目录

一.两个有序数组的合并

思路 1:

思路 2:(复杂,不做代码演示)

代码演示:(支持C99变长数组)

注意:

二.调整数组使奇数全部都位于偶数前面

思路 1:

代码演示:

思路2:

代码演示:

三.矩阵式的输入

一.两个有序数组的合并

  • 输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
  • 数据范围: 1≤n,m≤1000, 序列中的值满足  0≤val≤30000 

例如:那些让我绞尽脑汁的 数组例题_第1张图片

这里的思想与“两个有序链表合并”相似

思路 1:

数组1从 i=0,数组2从 j=0,分别比较大小。小的放到 arr3 里,其与 arr3 的下标各 +1。多次比较。

若一个数组到头了,由于2个数组都是升序,将没到头的数组里,剩下的元素放到 arr3

里。

思路 2:(复杂,不做代码演示)

将 arr1 arr2 分别放到 arr3 里,再将 arr3 排序

代码演示:(支持C99变长数组)

int main()
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int arr1[n];
    int arr2[m];
    int arr3[n + m];//注意:不能初始化
    
    //arr1的输入
    int i = 0;
    for (i = 0; i < n; i++) 
    {
        scanf("%d", &arr1[i]);
    }

    //arr2的输入
    int j = 0;
    for (j = 0; j < m; j++) 
    {
        scanf("%d", &arr2[j]);
    }

    //合并数组
    i = 0;
    j = 0;
    int q = 0;
    while(i

注意:

  1. 数组名 arr 是首元素地址,但 arr[ i ] 是单个元素, scanf 输入时,要 &  !!!
  2. int arr1[ n ] 时,不能初始化!
  3. 对于不支持C99变长数组,可以这样写:
int main() 
{
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);

    int arr1[1000];
    int arr2[1000];
    int arr3[2000];
    
    //......

二.调整数组使奇数全部都位于偶数前面

思路 1:

  1. 给定两个下标left和right,分别放在数组始末位置
  2. 循环进行以下操作 :
  • a. 如果 left 和 right 表示的区间 [ left, right ] 有效,进行b,否则结束循环  
  • b. left从前往后找,找到一个偶数后停止  
  • c. right从后往前找,找到一个奇数后停止  
  • d. 如果left和right都找到了对应的数据,则交换,继续a,

代码演示:

注意:在 while 里的两个 while 如果不加 ( left

void move(int arr[], int sz)
{
	int left = 0;
	int right = sz - 1;

	while (left

思路2:

创建第二个数组,将第一个数组中奇数拿出来,放在 arr2 的前面;偶数在后面

代码演示:

int main()
{
	int arr1[10] = { 0 };
	int sz = sizeof(arr1) / sizeof(arr1[0]);

	int arr2[sz];

	int i = 0;
	for (i = 0; i < sz; i++)
	{
		scanf("%d", &arr1[i]);
	}

	int l = 0;
	int r = sz - 1;

	for (i = 0; i < sz; i++)
	{
		if (arr1[i] % 2 == 0)//偶数放后面
		{
			arr2[r--] = arr1[i];
		}
		if (arr1[i] % 2 == 1)//奇数放前面
		{
			arr2[l++] = arr1[i];
		}
		if (l > r)
			break;
	}

	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr2[i]);
	}

	return 0;
}

三.矩阵式的输入

我们想要输入 n 行 m 列的矩阵时

int main()
{
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
	int arr[n][m];

	int i = 0;
	for (i = 0; i < n; i++)
	{
		int j = 0;
		for (j = 0; j < m; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}

	return 0;
}

注意:这里每输入一行,不需要 \n 换行。数组会找到它定义的空间

如果是不支持C99变长数组的编译器呢?

int main()
{
	int n = 0;
	int m = 0;
	scanf("%d %d", &n, &m);
    //请输入<1000的nm值
	int arr[1000][1000];

	int i = 0;
	for (i = 0; i < n; i++)
	{
		int j = 0;
		for (j = 0; j < m; j++)
		{
			scanf("%d", &arr[i][j]);
		}
	}

	return 0;
}

我们这样写也不用考虑会不会打印成一排(打印错误),因为:

假定 n = 2   m = 3

那些让我绞尽脑汁的 数组例题_第2张图片

当n和m的值确定时,想往里输入值的空间就确定了

本篇的分享就到这里了,感谢观看,如果对你有帮助,别忘了点赞+收藏+关注

小编会以自己学习过程中遇到的问题为素材,持续为您推送文章

你可能感兴趣的:(#,C语言,c语言)