C语言 有序序列的 判断 / 删除指定数 / 去重 / 合并两个为一个

目录

一,有序序列的判断

二,序列中删除指定数字

三,序列中整数去重

四,合并两个有序序列


一,有序序列的判断

题目描述:

输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。

输入描述:

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

第二行输入N个整数,用空格分隔N个整数。

输出描述:

输出为一行,如果序列有序输出sorted,否则输出unsorted。

思路:

问:如何判断序列是否有序或者说一个序列有序有什么特点?

答:如果一个序列升序(降序),则从第二项开始,每一项减去前一项都大于0(小于0)。

解题步骤:

1,首先,我们先写出代码的框架

这里的Judge函数我们先设计它的功能:接收有n个元素的序列arr,判断该序列是否有序,有序输出sorted,否则输出unsorted。

int main()
{
	int n = 0;
	int i = 0;
	int arr[100] = { 0 };

	scanf("%d", &n);

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

	Judge(arr, n);

	return 0;
}

2,实现Judge函数的功能

Judge函数返回类型为void,在函数内部创建了flag1flag2两个变量(根据两个变量值的变化用来判断数组是否有序),for循环遍历整个数组使数组arr从第二项开始与前一项相减并判断:

1,如果当前项减去前一项大于等于0,则赋值flag1为1,(说明后一项大于等于前一项)

2,如果当前项减去前一项小于0,则赋值flag2为1,(说明后一项小于前一项)

注:当for循环结束,数组arr从第二项开始每一项都与前一项相减后跳出循环,此时如果flag1flag2只有一个为1,则说明数组arr从第二项开始每一项都大于等于或者小于前一项,为有序;如果flag1flag2都为1,则说明数组arr中存在后一项大于等于前一项的情况,也存在后一项小于前一项的情况,为无序。

void Judge(int* arr, int n)
{
	int flag1 = 0;
	int flag2 = 0;
	int i = 0;

	for (i = 0; i < n-1; i++)
	{
		if (*(arr + i + 1) - *(arr + i) < 0)
		{
			flag1 = 1;
		}
		if (*(arr + i + 1) - *(arr + i) >= 0)
		{
			flag2 = 1;
		}
	}

	if (flag1 + flag2 == 1)
	{
		printf("sorted\n");
	}
	else
	{
		printf("unsorted\n");
	}
}

二,序列中删除指定数字

题目描述:

有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。

输入描述:

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

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

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

输出描述:

输出为一行,删除指定数字之后的序列。

思路:

问:如何在序列中找到指定的数字M,如何得到并输出删除指定数字之后的序列?

答:通过下标访问数组即可找到数字M,以及数字M对应的下标,然后从该数组元素开始后一项覆盖前一项即可

解题步骤:

1,首先,我们先写出代码的框架

这里的Chage函数我们先设计它的功能:接收有n个元素的数组arr和指定要求删除的数字m后,数组arr中为数字m的项以及它之后的每一项均被后一项覆盖,并输出删除指定数字之后的序列。

int main()
{
	int n = 0;
	int i = 0;
	int arr[100] = { 0 };
	int m = 0;

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

	Chage(arr, n, m);

	return 0;
}

2,实现Chage函数的功能

Chage函数返回类型为void,for循环通过变量i遍历数组每一项,当在数组arr中发现数字m时(假设此时该元素下标为i),进入if语句,使从arr[i]开始的每一项都被后一项覆盖,并且n--(每覆盖一个元素,数组元素个数-1),i--(在完成覆盖操作后,原来的i+1项成为了i项,i--为了防止遗漏)

注:if语句中的for循环的作用是把数组中的元素后一项的值赋给前一项,最后一项由于没有后一项赋值,所以值不变,但由于数组长度-1,所以忽略了最后一项

void Chage(int* arr, int n, int m)
{
	int i = 0;
	int j = 0;

	for (i = 0; i < n; i++)
	{
		if (*(arr + i) == m)
		{
			for (j = i; j < n-1; j++)
			{
				*(arr + j) = *(arr + j + 1);
			}
			n--;
			i--;
		}
	}

	for (i = 0; i < n; i++)
	{
		printf("%d ", *(arr + i));
	}
}

三,序列中整数去重

(与二,序列中删除指定数字相似,不同点在于删除的数字来源是用户输入,还是序列本身

题目描述:

输入n个整数的序列,要求对这个序列进行去重操作。所谓去重,是指对这个序列中每个重复出现的整数,只保留该数第一次出现的位置,删除其余位置。

输入描述:

输入包含两行,第一行包含一个正整数n(1 ≤ n ≤ 1000),表示第二行序列中数字的个数;第二行包含n个整数(范围1~5000),用空格分隔。

输出描述:

输出为一行,按照输入的顺序输出去重之后的数字,用空格分隔。

思路:

问:如何在序列中找到重复的数字,如何得到并输出去重之后的序列?

答:通过下标访问数组,从第一项开始到倒数第二项,查找该项之后是否存在与自己相同的数字,有则执行后一项覆盖前一项的操作,即可去重

解题步骤:

1,首先,我们先写出代码的框架

这里的Chage函数我们先设计它的功能:接收有n个元素的数组arr后,重复的数字保留先出现的一项,并输出去重之后的序列。

int main()
{
	int n = 0;
	int i = 0;
	int arr[100] = { 0 };

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

	Chage(arr, n);

	return 0;
}

2,实现Chage函数的功能

Chage函数返回类型为void,第一层for循环和第二层for循环是通过变量i变量j来实现arr[0]与arr[0]之后所有元素的比较(i=0时),arr[1]与arr[1]之后所有元素的比较(i=1时)……直到arr[n-1],if语句for循环是当发现重复元素时,后一项给前一项赋值完成覆盖(直到arr[n-1])

注:1,n--(每覆盖一个元素,数组元素个数-1)

2,j--(在完成覆盖操作后,原来的j+1项成为了j项,j--为了防止遗漏)

void Chage(int* arr, int n)
{
	int i = 0;
	int j = 0;
	int k = 0;

	for (i = 0; i < n; i++)
	{
		for (j = i + 1; j < n; j++)
		{
			if (*(arr + i) == *(arr + j))
			{
				for (k = j; k < n - 1; k++)
				{
					*(arr + k) = *(arr + k + 1);
				}
				j--;
				n--;
			}
		}
	}

	for (i = 0; i < n; i++)
	{
		printf("%d ", *(arr + i));
	}
}

四,合并两个有序序列

题目描述:

输入两个升序排列的序列,将两个序列合并为一个有序序列并输出

输入描述:

输入包含三行,
第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。
第二行包含n个整数,用空格分隔。
第三行包含m个整数,用空格分隔。

输出描述:

输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。

思路:

问:如何得到一个新的升序序列,这个新的升序序列元素全部来自用户输入的两个升序序列?

答:将用户输入的两个序列的元素全部放入一个新的序列中去,然后排序,即可得到包含所有元素的升序的序列

解题步骤:

1,首先,我们先写出代码的框架

这里的Ass函数我们先设计它的功能:接收数组元素个数为n的数组arr1,接收元素个数为m的数组arr2,并将这两个数组中的元素放入数组arr3中

这里的Sort函数我们先设计它的功能:接收数组元素个数为n+m的数组arr3并排序

int main()
{
	int n = 0;
	int m = 0;
	int i = 0;
	int arr1[1000] = { 0 };
	int arr2[1000] = { 0 };
	int arr3[2000] = { 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]);
	}

	Ass(arr1, arr2, arr3, n, m);
	Sort(arr3, n, m);

	for (i = 0; i < n + m; i++)
	{
		printf("%d ", arr3[i]);
	}

	return 0;
}

2,实现Ass函数的功能

void Ass(int* arr1, int* arr2, int* arr3, int n, int m)
{
	int i = 0;
	for (i = 0; i < n; i++)
	{
		*(arr3 + i) = *(arr1 + i);
	}
	for (i = n; i < n + m; i++)
	{
		*(arr3 + i) = *(arr2 + i - n);
	}
}

3,实现Sort函数的功能

注:这里使用的是选择排序

void Sort(int* arr3, int n, int m)
{
	int i = 0;
	int j = 0;
	int temp = 0;

	for (i = 0; i < n + m; i++)
	{
		for (j = i + 1; j < n + m; j++)
		{
			if (*(arr3 + i) > *(arr3 + j))
			{
				temp = *(arr3 + i);
				*(arr3 + i) = *(arr3 + j);
				*(arr3 + j) = temp;
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y雨何时停T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值