之前一直在刷牛客网上的题目,一些和序列有关的题目想分享一下自己的思路
目录
1.有序序列插入一个数
思路:题目声明0<=N<=50,那么创建一个有50个元素的数组,将插入的数字放在数组最后,然后冒泡排序
代码如下:
#include<stdio.h>
int main()
{
int arr[50]={0};
int n=0;
int i=0;
scanf("%d",&n);
while(i<n)
{
scanf("%d",&arr[i]);
++i;
}
int input=0;
scanf("%d",&input);
arr[n]=input;
for(int a=n;a>0;--a)
{
if(arr[a]<arr[a-1])
{
arr[a]=arr[a]^arr[a-1];
arr[a-1]=arr[a]^arr[a-1];
arr[a]=arr[a]^arr[a-1];
}
}
for(int b=0;b<=n;++b)
{
printf("%d ",arr[b]);
}
return 0;
}
运行结果:
2.序列去重并排序
思路:创建数组arr,另arr[k]=k,这样同时解决排序和去重的问题,输出时如果arr[i]!=0就输出,不过这种解法只适用于题目中的情况,如果n允许为0或者负数的话就不行了
代码:
#include<stdio.h>
int main()
{
int arr[100000]={0};
int n=0;
scanf("%d",&n);
int k=0;
int max=0;
int i=0;
for(i=0;i<n;++i)
{
scanf("%d",&k);
arr[k]=k;
if(k>max)
max=k;
}
for(i=0;i<max+1;++i)
{
if(arr[i]!=0)
printf("%d ",arr[i]);
}
return 0;
}
3.移除序列中的指定元素
思路1:新建数组,遍历数组的所有元素,若指针的值不是要删除的值就放进新数组内,输出新数组的元素
代码:
#include<stdio.h>
int main()
{
int arr1[50]={0};
int arr2[50]={0};
int n=0;
scanf("%d",&n);
int i=0;
for( i=0;i<n;++i)
{
scanf("%d",&arr1[i]);
}
int input =0;
scanf("%d",&input);
for(i=0;i<n;++i)
{
if(arr1[i]!=input)
{
arr2[i]=arr1[i];
printf("%d ",arr2[i]);
}
}
return 0;
}
运行结果:
思路2:定义变量src、dst为0 ,它们的运动规律如下
1.当arr[src]不是要删除的值的时候,arr[dst]=arr[src],src++,dst++
2.当arr[dst]的值是要删除的值的时候,dst不动,src++
分析:
初始src和dst指向的值相同
二者向后移动,即使arr[src]的值赋给arr[dst]也没有影响,当它们指向4时,此时dst不动,src向后移动
arr[src]的值给arr[dst],二者同时向后移动
再次赋值
在循环的时候加上条件防止src越界,打印时到dst为止即可
代码:
#include<stdio.h>
int main()
{
int arr1[50]={0};
int n=0;
scanf("%d",&n);
int i=0;
for( i=0;i<n;++i)
{
scanf("%d",&arr1[i]);
}
int input =0;
scanf("%d",&input);
int src=0,dst=0;
while(src<n)
{
if(arr1[src]!=input)
{
arr1[dst]=arr1[src];
src++;
dst++;
}
else
src++;
}
for(i=0;i<dst;++i)
{
printf("%d ",arr1[i]);
}
return 0;
}
运行结果:
目前能力有限,对于上述题目如果有更好的解决思路也欢迎补充
完