目录
第一题:有序序列判断
所谓的有序就是指升序或者降序
升序:1 2 3 4 5 6 7 8 9.......
降序:9 8 7 6 5 4 3 2 1......
下面来看题
思路
当该序列既有升序又有降序的时候那么这个序列就是无序的
伪代码
●初始化两个标记,一个标记代表降序,一个代表升序
●判断数组相邻两个元素的大小关系,并改变标记的值
●当两个标记都改变时,代表无序unsorted,否则代表有序sorted
代码
#include<stdio.h>
int main(){
int arr[200],n,i,flag1=0,flag2=0;//flag*为两个标记
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
for(int i=0;i<n-1;i++){
if(arr[i]>arr[i+1]){
flag1=1;
}else if(arr[i]<arr[i+1]){
flag2=1;
}
}
if(flag1&&flag2){
printf("unsorted\n");
}else{
printf("sorted\n");
}
return 0;
}
时间复杂度为O(n)遍历了整个数组
额外空间复杂度为O(1)只用了几个变量
第二题:有序序列合并
题目:
思路
我的第一思路就是通过归并排序来解决,但是归并排序只能解决,两个数组之间只多一个元素的情况,所以这个思路不可以。因为是有序的且为升序,所以我们可以比较两个数组里面的元素,将小的的印出来,直到其中一个数组越界,那么剩下的元素就是递增的(这个思想和归并排序差不多)接着打印出来
伪代码
●通过循环在其中一个数组越界之前打印出两个数组中较小的值
●通过判断打印出剩下的元素的值,这些值都是递增的且有序
代码
#include <stdio.h>
int main()
{
int n = 0;
int m = 0;
int arr1[100] = {0};
int arr2[100] = {0};
//输入
scanf("%d %d", &n, &m);
int i = 0;
for(i=0; i<n; i++)
{
scanf("%d", &arr1[i]);
}
for(i=0; i<m; i++)
{
scanf("%d", &arr2[i]);
}
//处理
int j = 0;
i = 0;
while(i<n && j<m)//在其中一个数组越界前打印出较小的元素
{
if(arr1[i] < arr2[j])
{
printf("%d ", arr1[i]);
i++;
}
else
{
printf("%d ", arr2[j]);
j++;
}
}
if(i == n)//判断是那个数组越界
{
for(; j<m; j++)
{
printf("%d ", arr2[j]);
}
}
else
{
for(; i<n; i++)
{
printf("%d ", arr1[i]);
}
}
return 0;
}
第三题:序列中删除指定数字
思路
这个题目很简单,我们只需要遍历整个数组,将不等于要删除的元素打印出来即可
没有伪代码
代码
#include<stdio.h>
int main(){
int arr[50]={0};
int n=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&arr[i]);
}
int x;
scanf("%d",&x);
for(int i=0;i<n;i++){
if(arr[i]!=x){
printf("%d ",arr[i]);
}
}
}