第四题 编程题
题目如下:
有n(n很大)个范围为0~32767数字,其中有大量重复的数,在main函数中已读入到data 数组中,请编写函数fun,计算剔除重复数字之后,还剩下几个数。
fun函数的功能是:传入两个形参,一个是数组data,一个是n的值,经过计算,返回剔除 重复数字后剩下的数字的个数。
比如,
程序运行时输入: 5 1 1 3 1 3
则程序输出:2
要求:请衡量时间复杂度和空间复杂度,尽量设计高效算法。请在prog1.c最前面的注释部 分介绍自己的算法。
注意:部分源程序存在文件prog1.c中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句
prog1.c如下
#include <stdio.h>
NONO();
/*
请在此解释自己的算法,并说明时间复杂度及空间复杂度
*/
int fun(int array[],int n)
{
}
int main()
{
int data[200000];//数组长度不超过200000
int n,count,i;
scanf("%d", &n);
for(i=0; i<n; i++) //data数组实际存放n个元素
scanf("%d", &data[i]);
count=fun(data,n);
printf("%d\n", count);
NONO();
return 0;
}
NONO()
{//本函数用于辅助教师判卷,不需要阅读其中代码,也请不要改动其中代码。
FILE *rf,*wf ;
int a[1000], i, j, p, n ;
rf = fopen("bc2.in", "r") ;
wf = fopen("p1.out", "w") ;
for(i = 0 ; i < 6 ; i++)
{
fscanf(rf, "%d", &n) ;
for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;
p=fun(a, n) ;
fprintf(wf, "%d\n", p) ;
}
fclose(rf) ;
fclose(wf) ;
}
直接看代码
补全后的代码
#include <stdio.h>
//NONO();
//采用了冒泡排序法,将数组的元素按照从小到大进行排序,新开辟了一个数组b,将所有都不重复的元素存储到b中,
//数组b的长度即为答案
//时间复杂度0(n2) 空间复杂度0(n)
/*
请在此解释自己的算法,并说明时间复杂度及空间复杂度
*/
int *bubble_sort(int arr[],int size){
//冒泡排序
int i,j;
for(i=0;i<size-1;i++)
{
for(j=0;j<size-i-1;j++)
if(arr[j]>arr[j+1])
{
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
return arr;
}
int fun(int array[],int n)//5 1 1 3 1 3 输出3
{
bubble_sort(array,n);
int b[n];
int i;
int j=0;
for(i=0;i<n;i++){
if(array[i]!=array[i+1])
b[j++]=array[i];
}
return j;
}
int main()
{
int data[200000];//数组长度不超过200000
int n,count,i;
scanf("%d", &n);
for(i=0; i<n; i++) //data数组实际存放n个元素
scanf("%d", &data[i]);
count=fun(data,n);
printf("%d\n", count);
//NONO();
return 0;
}
NONO()
{//本函数用于辅助教师判卷,不需要阅读其中代码,也请不要改动其中代码。
FILE *rf,*wf ;
int a[1000], i, j, p, n ;
rf = fopen("bc2.in", "r") ;
wf = fopen("p1.out", "w") ;
for(i = 0 ; i < 6 ; i++)
{
fscanf(rf, "%d", &n) ;
for(j = 0 ; j < n ; j++) fscanf(rf, "%d", &a[j]) ;
p=fun(a, n) ;
fprintf(wf, "%d\n", p) ;
}
fclose(rf) ;
fclose(wf) ;
}
第五题编程题:双亲表示法的树中,求出两个结点最近的共同祖先节点
解决思路:
1.遍历求出要求得两个节点的下标
2.通过while循环,如果他们的双亲下标相等,则退出
3.通过双亲下标,返回双亲数据域
#include <stdio.h>
#define MAX_TREE_SIZE 100
struct PTNode /*树的一个结点*/
{
char data;
int parent; /* 双亲位置域 */
};
struct PTree
{
struct PTNode nodes[MAX_TREE_SIZE];
int n; /* 结点数 */
};
/*
时间复杂度:O(n)
空间复杂度:O(1)
*/
char GetNearestCommonGrand(struct PTree T, char nodeData1, char nodeData2)
{
int i;
int index1;
int index2;
int number=T.n;
for(i=0;i<number;i++){
if(T.nodes[i].data==nodeData1)
{
index1=i;
break;
}
}
for(i=0;i<number;i++){
if(T.nodes[i].data==nodeData2)
{
index2=i;
break;
}
}
while(T.nodes[index1].parent!=T.nodes[index2].parent){
index1=T.nodes[index1].parent;
index2=T.nodes[index2].parent;
}
int temp=T.nodes[index1].parent;
return T.nodes[temp].data;
}
struct PTree CreateTree()
{
int i,n;
int parentId;
char ch;
struct PTree newTree;
scanf("%d", &n);
newTree.n=n;
for (i = 0; i < n; i++)
{
scanf(" %c%d", &ch, &parentId);
newTree.nodes[i].data=ch;
newTree.nodes[i].parent=parentId;
}
return newTree;
}
int main()
{
struct PTree aTree;
char node1, node2, nodeGrand;
aTree = CreateTree();
scanf(" %c %c", &node1, &node2);
nodeGrand= GetNearestCommonGrand (aTree, node1, node2);
printf("%c\n", nodeGrand);
return 0;
}