1.给定一个具有n个元素的数组N,以及指定数字m,输出m个不同元素的全排列。
#include <stdio.h>
const int INF=100;
int arr[INF];
int swapp(int a[],int i,int j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
return 0;
}
int perm(int a[],int k,int n,int m){
if(k==m){
for(int i=0;i<m;i++){
printf("%d ",a[i]);
}
printf("\n");
return 0;
}
for(int i=k;i<n;i++){
swapp(a,i,k);
perm(a,k+1,n,m);
swapp(a,i,k);
}
return 0;
}
int main(){
int n=3,m=2;
for(int i=0;i<INF;i++){
arr[i]=i;
}
perm(arr,0,n,m);
return 0;
}
2.请编程实现对于DAG (有向无环图)的管理,要求能够新建,添加节点,删除节点,查找节点。并且使用你设计实现的程序,完成对于给定两个节点输出节点间的所有通路。
#include <stdio.h>
#include <string.h>
#include <set>
#include <vector>
using namespace std;
const int INF=100;
set<int> sett;
vector<int> vec;
int tabb[INF][INF];
int npath=8;
int input[8][2]={1,2,
1,3,
1,4,
3,2,
3,5,
4,5,
6,5,
6,4};
int addd(int a,int b){
tabb[a][b]++;
return 0;
}
int dell(int a){
for(int i=0;i<INF;i++){
tabb[i][a]=0;
tabb[a][i]=0;
}
return 0;
}
int findd(int a){
for(int i=0;i<INF;i++){
if(tabb[i][a]){
printf("path %d to %d\n",i,a);
}if(tabb[a][i]){
printf("path %d to %d\n",a,i);
}
}
return 0;
}
int walkk(int a,int b){
if(tabb[a][b]){
for(int i=0;i<vec.size();i++){
printf("%d ",vec[i]);
}
printf("%d\n",b);
}
for(int i=0;i<INF;i++){
if(tabb[a][i]&&sett.count(i)==0){
vec.push_back(i);
walkk(i,b);
vec.pop_back();
}
}
return 0;
}
int main(){
memset(tabb,0,sizeof(tabb));
for(int i=0;i<npath;i++){
addd(input[i][0],input[i][1]);
}
findd(4);
vec.push_back(1);
walkk(1,6);
vec.pop_back();
return 0;
}
3.给出算法,以最小代价判断一个单向链表是否存在环路。
#include <stdio.h>
const int INF=5;
struct Node{
int value;
Node* next=NULL;
};
Node chain[10];
int main(){
int con=0;
for(int i=0;i<INF;i++){
chain[i].value=i;
chain[i].next=&chain[i+1];
}
chain[INF-1].next=&chain[con];
Node* slow=&chain[0];
Node* fast=&chain[0];
for(int i=0;i<INF;i++){
printf("now:slow->%d,fast->%d\n",slow->value,fast->value);
slow=slow->next;
fast=fast->next;
fast=fast->next;
if(fast==NULL){
printf("No loop\n");
break;
}
if(fast==slow){
printf("Loop\n");
return 0;
}
}
return 0;
}
4.请设计一个二又树数据姑构(每个节点存储一个整数),实现向二又树内插入一个整数的操作,要求保证树中任意一个节点A的左子树中的所有节点存储的整数都小于等于A存储的整数,右子树中的所有节点存储的整数都大于等于A存储的整数。
#include <stdio.h>
using namespace std;
const int INF=5;
int a[INF]={3,4,0,1,2};
struct Node{
int value=0;
Node* left=nullptr;
Node* right=nullptr;
};
int Insertt(Node* &root,int val){
if(root==nullptr){
root=new Node;
root->value=val;
}
else if(val<=root->value){
if(root->left==nullptr){
Node *temp=new Node;
temp->value=val;
root->left=temp;
}else{
Insertt(root->left,val);
}
}else if(val>root->value){
if(root->right==nullptr){
Node *temp=new Node;
temp->value=val;
root->right=temp;
}else{
Insertt(root->right,val);
}
}
return 0;
}
int Printt(Node* root){
if(root->left!=nullptr){
Printt(root->left);
}
printf("%d ",root->value);
if(root->right!=nullptr){
Printt(root->right);
}
return 0;
}
int main(){
Node* root=nullptr;
for(int i=0;i<INF;i++){
Insertt(root,a[i]);
}
Printt(root);
return 0;
}
4.小明刚到最近入职一个新的互联网公司,从网管部门那里领取了电脑之后忘记索要IP地址,然而网管部门人员比较繁忙,无法详细的告诉小明详细的信息,只是匆匆茫茫写了几个数字,如"12325523135", 告诉小明这个是IPv4地址,因为不是正常的 IPv4地址写法,小明无法确认正确的ip地址是什么,马上就是周末了,小明先赶在这周末之前
把个人信息录入系统:因此,小明需要写一个程序,解析这个字符串为有效的ip地址,以保证可以正常上网。现在你要帮小明设计一个算法,从一个字符串中解析出有效的ip地址
#include <stdio.h>
#include <string.h>
using namespace std;
int fit(int i){
if(i<=255&&i>=0){
return 1;
}
return 0;
}
int main(){
char a[100]="12325523135";
//scanf("%s",&str);
int len=strlen(a);
int iv=0,jv,kv,lv;
for(int i=1;i<=3;i++){
iv=(a[i-1]-'0')+iv*10;
jv=0;
for(int j=1;j<=3;j++){
jv=(a[i+j-1]-'0')+jv*10;
kv=0;
for(int k=1;k<=3;k++){
kv=(a[i+j+k-1]-'0')+kv*10;
lv=0;
for(int l=1;l<=3;l++){
lv=(a[i+j+k+l-1]-'0')+lv*10;
if(fit(iv)&&fit(jv)&&fit(kv)&&fit(lv)&&len==(i+j+k+l)){
printf("%d:%d:%d:%d\n",iv,jv,kv,lv);
}
}
}
}
}
return 0;
}
5.设计并实现一个xml解析器,要求,输入一个xml文件/字符串,能够将该输入解析成
树(dom树)并存储在内存中,节点要求至少保留原输入中的: 1.标签,2.至少两个属性,3.标签内容;如果能够处理不标准的/非法的xml文件如丢失结尾标签,标签丢失符号如:开始标签丢失了“>”变成“<XXX”;结尾标签丢失"<"变成"ZZZ>"等多种情况,每多处理一种异常视异常难度加分。
6.现在有一个xml文件,要求利用第6题刚刚实现的解析器完整dom树的构建,并对其实现先序遍历|先根遍历,在遍历过程中选择出标签内容符合如下规则的“+数字(三个数字)-八个数字”标签,标签按照规则中括号内的三个数字进行升序排列并输出。