目录
一,有序序列的判断
二,序列中删除指定数字
三,序列中整数去重
四,合并两个有序序列
题目描述:
输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。
输入描述:
第一行输入一个整数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,在函数内部创建了flag1和flag2两个变量(根据两个变量值的变化用来判断数组是否有序),for循环遍历整个数组使数组arr从第二项开始与前一项相减并判断:
1,如果当前项减去前一项大于等于0,则赋值flag1为1,(说明后一项大于等于前一项)
2,如果当前项减去前一项小于0,则赋值flag2为1,(说明后一项小于前一项)
注:当for循环结束,数组arr从第二项开始每一项都与前一项相减后跳出循环,此时如果flag1和flag2只有一个为1,则说明数组arr从第二项开始每一项都大于等于或者小于前一项,为有序;如果flag1和flag2都为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;
}
}
}
}