东华2017复试上机真题

第四题 编程题
题目如下:
有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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值