个人准备复试上机时,遇到的题,方便之后巩固
上机练习题型
全排列
运用递归方法,对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;
}