C语言 计算机考研408数据结构历年真题算法题简易暴力解

自己手写的暴力算法然后抄到计算机上的,没做过输入输出测试,但是思路应该正确,大家看个思路就行,408考试的时候也不硬性要求ac,如果有问题欢迎指正共同学习!

习题顺序参考22版王道书的章节顺序

2010年

void Move(int R[],int p,int n){
    
    //lenth=n
	int L[n]={
    
    0};		//Create auxiliary array
	for(int i=0;i<n;i++){
    
    
		if(i-p>=0)	L[i-p]=R[i];	//Assign a value to the corresponding position of the auxiliary array
		else 		L[n+i-p]=R[i];
	}
	for(int i=0;i<n;i++)	R[i]=L[i];
}

时间复杂度O(n),空间复杂度O(n)

2011年

int midSerch(int a[],int b[],int n){
    
    
	int c[2*n]={
    
    0};
	int i;
	for(i=0;i<2*n;i++){
    
    
		if(i<n)	c[i]=a[i];
		else	c[i]=b[i-n];
		quickSort(c,0,2*n-1);
		return c[n-1];
	}
}

void quickSort(int q[],int l,int r){
    
    //Quick sort template
    if(l>=r) return;
    int x=q[l + r >> 1],i=l,j=r;
    while(i<j){
    
    
        do i ++ ; while (q[i] < x);
        do j -- ; while (q[j] > x);
        if(i<j) swap(q[i],q[j]);
    }
    quick_sort(q,l,i-1);
    quick_sort(q,i,r);
}

2013年

int mainElement(int A[],int n){
    
    
	int B[n]={
    
    0},i;
	for(i=0;i<n;i++)	B[A[i]]++;
	int max=0;
	for(i=0;i<n;i++){
    
    //Traverse the auxiliary array to find the maximum number of occurrences
		if(B[i]>B[max])	max=i;
	}
	if(B[max>n/2])	return max;
	else			return -1;
}

时间复杂度O(n),空间复杂度O(n)

2018年

int findMin(int L[],int n){
    
    
	int i=1,k=0;
	while(i<=n){
    
    
		for(k=0;k<n;k++){
    
    
			if(L[k]==i){
    
    
				i++;
				break;	
			}	//找到后,+1跳出循环
		}
		if(k==n)	return i;	//若k=n-1,说明没找到,直接返回
	}
	return i;
}

时间复杂度O(n^2),空间复杂度O(1)

2020年

int solution(int a[],int b[],int c[],int n1,int n2,int n3){
    
    
	int i=0,j=0,k=0,dis=0;
	int min=99999;
	for(i=0;i<n1;i++){
    
    
		for(int j=0;j<n2;j++){
    
    
			for(int k=0;k<n3;k++){
    
    
				dis=abs(a[i]-b[j])+abs(b[j]-c[k])+abs(c[k]-a[i]);//abs为求绝对值函数
				if(dis<min)	min=dis;
			}
		}
	}
	return dis;
}

int abs(int a){
    
    
	if(a<0) return -a;
	else	return a;
}

时间复杂度O(n^3)空间O1

2009年

/*
设置两个指针p,q,一个变量count,p一直遍历到最后,count负责计数,
然后将q遍历到count-k次,最后输出
*/


typedef struct LNode{
    
    
	int data;
	struct LNode *link;
}LNode,*Linklist

int SearchLink(Linklist list,int k){
    
    
	int count=0;
	Lnode *p=list->link,*q=*p;
	while(p->link!=NULL){
    
    
		count++;
		p=p->link;
	}
	if(count<k)	return 0;
	while(count-k>0){
    
    
		q=q->link;
		count--;
	}
	printf("%d",q->data);
	return 1;
}

时间复杂度O(mn),空间复杂度O(1)

2012年

思想:设置两个数组p,q,分别指向两个链表头节点,两个循环,p向后一步,q就遍历一遍,直到相等

typedef struct LNode{
    
    
	char data,
	struct LNode *next,
}*LinkList,LNode;
LNode *same_tail(LinkList str1,LinkList str2){
    
    
	LNode *p=str1->next,*q=str2->next;
	while(p->next!=NULL){
    
    
		while(q->next!=NULL){
    
    
			if(p==q) return p;
			q=q->next;
		}
		q=str2->next;
		p=p->next;
	}
}

时间复杂度O(mn)

有人看的话后面就慢慢更新,没人看就算了

猜你喜欢

转载自blog.csdn.net/qq_44232564/article/details/123830939
今日推荐