北航機試題2017(題目+代碼)

 

https://apriljia.com/2018/07/12/%E5%8C%97%E8%88%AA%E4%B8%8A%E6%9C%BA%E8%AF%95%E9%A2%982017%EF%BC%88%E9%A2%98%E7%9B%AE%E4%BB%A3%E7%A0%81%EF%BC%89/

1.求中位數的位置

先輸入一個整形數字N,接着輸入N個無序的數字。要求輸出升序排列後的中位數,以及該中位數輸入的次序。如果N爲偶數,則輸出有二箇中位數,如果N爲奇數,輸出最中間的數即可。

樣例1:

輸入:5

9 2 7 1 6

輸出:6 5

樣例2:

輸入:6

9 6 7 1 2 3

輸出:3 6

6 2

 

#include "stdafx.h"
#include <iostream>
#include <string>
#include "math.h"
#include "stdio.h"
#include "string.h"
#include <vector>
#include <queue>
#include <map>
#include <algorithm>

using namespace std;
int max(int x,int y){
	return x>y?x:y;
}

struct number{
	int value;
	int index;
	bool operator <(number b){
		return value<b.value;
	}
};
int main(int argc, char* argv[])
{
	int n,odd;
	number num[100];
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>num[i].value;
		num[i].index=i;
	}
	sort(num,num+n);

	if(n&1==1) cout<<num[n/2].value<<" "<<num[n/2].index+1;
	else cout<<num[n/2-1].value<<" "<<num[n/2-1].index+1<<endl
		<<num[n/2].value<<" "<<num[n/2].index+1;
	return 0;
}

 

2.查找未定義變量

 

輸入兩個C語言語句,第一句爲正常的C語言變量定義語句,符合C語言語法要求,變量間可以有多個空格,包含數組,指針定義等。第二句爲變量運算語句,要求輸出第二個C語言語句中未定義的變量。

樣例:

輸入: int x12, y=1, num_stu=89, a[30], *p;

Sum=num+x12*y;

輸出:

Sum num

#include "stdafx.h"
#include <iostream>
#include <string>
#include "math.h"
#include "stdio.h"
#include "string.h"
#include <vector>
#include <queue>
#include <map>
#include <algorithm>

using namespace std;
int max(int x,int y){
	return x>y?x:y;
}

int nextvar(string str,int &curindex,string &nextstr){				
	if(curindex>=str.size()-1) return 0;
	int startindex,endindex;
	int delindex;
	while(str[curindex]=='*'||str[curindex]==' ') curindex++;   //è¥3y±?á????°?àóàμ?????oí*
	startindex=curindex;
	endindex=str.find(",",startindex);
	if(endindex==string::npos) endindex=str.find(";",startindex);

	curindex=endindex+1;
	if(!(endindex>startindex)) return 0;
	nextstr=str.substr(startindex,endindex-startindex);

	delindex=nextstr.find("[");									
	if(delindex!=string::npos){
		nextstr.erase(delindex,nextstr.size());
	}
	delindex=nextstr.find("=");									
	if(delindex!=string::npos){
		nextstr.erase(delindex,nextstr.size());
	}
	if(!nextstr.empty()) return 1;
	else return 0;
}

int nextvar2(string str,int &curindex,string &nextstr){
	if(curindex>=str.size()-1) return 0;
	int startindex,endindex;
	while(str[curindex]=='*'||str[curindex]==' ') curindex++;   //è¥3y±?á????°?àóàμ?????oí*
	startindex=curindex;
	for(int i=startindex;i<str.size();i++){
		if(!( ((str[i]>='a')&&(str[i]<='z'))
			  ||((str[i]>='A')&&(str[i]<='Z'))
			  ||((str[i]>='0')&&(str[i]<='9'))
			  ||(str[i]=='_')))
		break;
	}
	endindex=i;
	curindex=endindex;
	if(str[curindex]=='[') {
		curindex++;
		while(str[curindex]!=']') curindex++;
	}
	if(str[curindex]==']') curindex++;
	curindex++;
	while((str[curindex]>='0')&&(str[curindex]<='9')) curindex++;

	//cout<<curindex<<" "<<str[curindex]<<endl;
	if(!(endindex>startindex)) return 0;
	nextstr=str.substr(startindex,endindex-startindex);
	if(!nextstr.empty()) return 1;
	else return 0;
}
int main(int argc, char* argv[])
{
	string str1,str2,nextstr;
	char s[100];
	vector<string> var;

	gets(s);
	str1=s;
	gets(s);
	str2=s;
	int length=str1.size();
	int curindex=0;
	while(str1[curindex]==' '){							
		str1.erase(curindex,curindex+1);
	}
	
	curindex=str1.find(" ");								
	while(nextvar(str1,curindex,nextstr)){				
		var.push_back(nextstr);
	}

	curindex=0;
	while(str2[curindex]==' '){							
		str2.erase(curindex,curindex+1);
	}
	while(nextvar2(str2,curindex,nextstr)){				
		int result=0;
		for(int i=0;i<var.size();i++){
			if(var[i]==nextstr) {
				result=1; 
				break;
			}
		}
		
		if (result==0) cout<<nextstr<<" ";
	}

	
	//for(vector<string>::iterator iter=var.begin();iter!=var.end();iter++) 
	//	cout<<*iter<<endl;


	
	return 0;
}

 

3.找家譜成員

 

輸入若干行,每一行的第一個輸入爲家譜中的某成員,該行接着輸入的信息爲每個孩子姓名。最後一行的輸入爲要求查找的兩個家譜成員的關係。要求:根據輸入的家譜成員信息,建立二叉樹家譜關係圖,並輸出二位待查找成員在家譜中的關係,包括輸出他們最鄰近的共同祖先以及在家譜中相差的層次數。

樣例:

輸入:

YE SHU MEI

SHU GE MEI1

BA SELF MEI2

GE SON1 SON2

SON2 MEI1

輸出:

SHU 1

#include "stdafx.h"
#include <iostream>
#include <string>
#include "math.h"
#include "stdio.h"
#include "string.h"
#include <vector>
#include <queue>
#include <map>
#include <algorithm>

using namespace std;
int max(int x,int y){
	return x>y?x:y;
}
struct treeNode{
	treeNode *parent;
	char lchild[20];
	char rchild[20];
	char name[20];
	int depth;
	treeNode(){
		depth=0;
		parent=NULL;
	}
};

treeNode node[100];

int main(int argc, char* argv[])
{
	char line[100];
	char nametmp[3][20];
	int spaceindex,curstart=0;
	int n=0,curcount=0,c=0;
	int nodeindex=0;
	bool readend=false,find=0,find1=0,find2=0;
	while(gets(line)){
		for(int i=0;i<strlen(line);i++){
			if (line[i]==' '){
				spaceindex=i;
				strncpy(nametmp[curcount],line+curstart,spaceindex-curstart);
				nametmp[curcount][spaceindex-curstart]=0;
				//cout<<nametmp[curcount];
				curcount++;
				curstart=spaceindex+1;
			}
			if (i==strlen(line)-1){
				spaceindex=i+1;
				strncpy(nametmp[curcount],line+curstart,spaceindex-curstart);
				nametmp[curcount][spaceindex-curstart]=0;
				//cout<<nametmp[curcount];
				curcount++;
				if(curcount==2) readend=true;
			}
			if(curcount==3) {
				spaceindex=0;
				curstart=0;
				curcount=0;
				find=0;
				find1=0;
				find2=0;
				for(int j=0;j<n;j++){
					if(strcmp(node[j].name,nametmp[0])==0){
						find=1;
						c=j;
					}
					if(strcmp(node[j].name,nametmp[1])==0){
						find1=1;
					}
					if(strcmp(node[j].name,nametmp[2])==0){
						find2=1;
					}
				}
				if(find==0){
					n++;
					c=n;
				}
				strcpy(node[c].name,nametmp[0]);
				strcpy(node[c].lchild,nametmp[1]);
				strcpy(node[c].rchild,nametmp[2]);
				cout<<c<<":"<<node[c].name<<" "<<node[c].lchild<<" "<<node[c].rchild<<endl;
				if(find1==0){
					n++;
					c=n;
					strcpy(node[c].name,nametmp[1]);
					cout<<c<<":"<<node[c].name<<endl;
				}
				if(find2==0){
					n++;
					c=n;
					strcpy(node[c].name,nametmp[2]);
					cout<<c<<":"<<node[c].name<<endl;
				}

			}
			if(readend==true) break;

		}
		if(readend==true) {
			for(i=1;i<=n;i++){
				for(int j=1;j<=n;j++){
					if(strcmp(node[i].lchild,node[j].name)==0){
						node[j].parent=&node[i];
						node[j].depth=node[i].depth+1;
					}
					if(strcmp(node[i].rchild,node[j].name)==0){
						node[j].parent=&node[i];
						node[j].depth=node[i].depth+1;
					}
				}
			}
			


			int dep1=0,dep2=0;
			treeNode *p1,*p2;
			for(i=1;i<=n;i++){
				if(strcmp(node[i].name,nametmp[0])==0){
					dep1=node[i].depth;
					p1=&node[i];
					cout<<"p1:"<<p1->name<<endl;
				}
				if(strcmp(node[i].name,nametmp[1])==0){
					dep2=node[i].depth;
					p2=&node[i];
					cout<<"p2:"<<p2->name<<endl;
				}
			}

			cout<<"depth="<<dep1-dep2<<endl;
			while(p1!=p2){
				if(p1->depth>p2->depth)
				{
					p1=p1->parent;
					cout<<"p1:"<<p1->name<<endl;
					continue;
				}
				if(p1->depth<p2->depth)
				{
					p1=p1->parent;
					cout<<"p2:"<<p2->name<<endl;
					continue;
				}
				if(p1->depth==p2->depth&&p1!=p2)
				{
					p1=p1->parent;
					p2=p2->parent;
					cout<<"p1:"<<p1->name<<endl;
					cout<<"p2:"<<p2->name<<endl;
				}
			}
			cout<<"parent:"<<p1->name<<endl;
			break;
		}

	}

	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章