复试上机题目练习


个人准备复试上机时,遇到的题,方便之后巩固

上机练习题型

全排列

运用递归方法,对n个数进行全排列:
(若要求对n个字母进行全排列,p[]类型可改为char,原代码中p[index]=i可改为p[idex] = i+‘a’-1或p[index] = i+‘A’-1)

#include<iostream>
using namespace std;

const int maxn = 11;
//p为当前排列,hashTable记录整数x是否已经在p中
int nn,p[maxn],hashTable[maxn] = {false};
//当前处理排列的第index位
void generateP(int index){
	int i= 1;
	if(index == nn+1){//递归边界,已经处理完排列的1~n位
		for(i = 1;i<=nn;i++){
			cout<<p[i];  //输出全排列
		}
		cout<<endl;
		return ;
	}else{
		for(i = 1;i<=nn;i++){
			if(hashTable[i]==false){  //处理不在p中的
				p[index] = i;        //i加入当前序列
				hashTable[i] = true;  //修改标记
				generateP(index+1);    //处理第index+1位
				hashTable[i]=false;   //递归的下边处理完了,返回到这里,还原状态
			}
		}
	}
}
int main(){
	nn = 3;
	generateP(1); //从1开始
	return 0;
}

运行结果

哈夫曼树最小带权路径

输入:
4
1,1,1,1
输出:最小带权路径
大体思路:建立小顶堆,将输入的顶点入堆,再每次取出堆中两个最小的元素即堆顶,作为左右孩子节点,将他们的和作为双亲,再放回堆中,如此反复。直到堆中只剩一个节点。

#include<iostream>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> > que;//优先队列.小顶堆

void main20192(){
	char a;
	int n,i = 0,num;
	while(cin>>n){
		while(que.empty()==false)que.pop();//清空堆中元素
		//输入   以,隔开
		for(i=1;i<=n;i++)
		{
			cin>>num;
			que.push(num);
			if(i!=n)cin>>a;//吸收最后一个回车
		} 
		int sum = 0;
		while(que.size()>1){
			//取出堆中两个最小的元素,作为同一节点的左右孩子,且双亲的权值是他们的和
			int a = que.top();
			que.pop();
			int b = que.top();
			que.pop();

			sum += a+b;//该父亲节点必为非叶子结点,累加
			que.push(a+b);//双亲的权值放回堆中
		}
		cout<<sum<<endl;
	}
}
int main(){
	main20192();
	return 0;
}

已知先序序列,中序序列求后序序列

先序的第一个字符为根节点,再去中序中找根节点的位置,并以此切分,得到左右子树的序列。左右子树再同理。此方法并没有建立出树,只是对字符串的划分

#include<iostream>
#include<string>
using namespace std;

typedef struct BTNode{
	char val;
	struct BTNode *left;
	struct BTNode *right;
}BTnode;

int index = 0;
//核心代码
void getTree(string front,string mid){
	if(mid.length() == 0)
		return ;

	char root = front[index ++];//index每次递归加一,用以获取先序中的下一个根字符

	int i = mid.find(root);  //找到根在中序中的位置

	//切分中序序列,得到左右两部分
	string left = mid.substr(0,i);
	string right = mid.substr(i+1,mid.length()-1);

	//后序遍历:左右根
	getTree(front,left);  //继续递归左边
	getTree(front,right);  //递归右边
	cout<<root;
}
void wangdao3334(){
	string front;
	string mid;
	cout<<"先序遍历:";
	cin>>front;
	cout<<"中序遍历:";
	cin>>mid;
	getTree(front,mid);
}

int main(){
	wangdao3334();
	return 0;
}

求一个数的m进制

#include<iostream>
using namespace std;

/** 输入num1,num2,求和的m进制,m<=16 */
void wangdao4342(){
	char num[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

	int m,num1,num2;
	cin>>m>>num1>>num2;

	int sum = num1+num2;
	char a[10],index = 0;
	while(sum!=0){
		a[index ++] = num[sum%m];//余数。主要是为了处理余数大于10的情况
		sum /= m;  //继续求下一位
	}

	for(m = index-1;m>=0;m--){
		cout<<a[m];  //倒着输出
	}
	cout<<endl;
}
int main(){
	wangdao4342();
	return 0;
}

未完待续

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