2019大疆机试编程题

题目:输入两个正整数n和m,构造一个长度为n+m的字符串,正好含有n个字母A和m个字母B,且这个字符串不能存在连续三个相同的字符,输出任意一个满足条件的字符串即可
实现思路,先得到前n个为字符A后m个为字符B的字符串,然后对这个字符串随机排序(随机排序参考了这篇文章https://blog.youkuaiyun.com/cighao/article/details/49072111),判断排序后的字符串是否满足连续性的要求,不满足则重新进行随机排序。
源程序

#include<iostream>
#include<string>
#include<vector>

#define MAX 20000

using namespace std;
struct element{     //用来排序的数据结构 
		int data;  // 数据 
		int index;  // 序号 
};

void rand_of_n(int a[],int n);  //产生 1-n 的随机排列并存到 a[] 中 
int cmp(const void *a,const void *b); //升序排列
vector<string> hebing(vector<string> _s1,vector<string> _s2);//获取满足条件的序列
bool lianxu(vector<string> _ss);
int main()
{
    int n,m;
    cin>>n>>m;
    if(3*m<n||3*n<m)
        return 0;
    vector<string> AA(n,"A");
    vector<string> BB(m,"B");

    vector<string> hebinghou=hebing(AA,BB);
    cout<<endl;
    for(size_t i=0;i<hebinghou.size();i++){
        cout<<hebinghou[i];
    }
    cout<<endl;
}

vector<string> hebing(vector<string> _s1,vector<string> _s2){
    int N=_s1.size()+_s2.size();
    vector<string> temp(_s1);
    temp.insert(temp.end(),_s2.begin(),_s2.end());
    int a[N];
    vector<string> string_hebing;

    //不断产生随机序列,知道满足条件为止
    while(1){
        string_hebing.clear();
        rand_of_n(a,N);//产生一个随机顺序
        for(int i=0;i<N;i++){
            string_hebing.push_back(temp[a[i]-1]);
        }
        if(!lianxu(string_hebing)){
            break;
        }
        //cout<<"new circle!\t";
    }
    return string_hebing;
}

void rand_of_n(int a[],int n){
	int i;
	struct element ele[MAX];
	srand((int)time(0));  // 初始化随机数种子 
	for(i=0;i<n;i++){
		ele[i].data=rand();  // 随机生成一个数 
		ele[i].index=i+1;
	}
	qsort(ele,n,sizeof(ele[0]),cmp);  //排序 
	for(i=0;i<n;i++){
		a[i]=ele[i].index;
	}
}
 
int cmp(const void *a,const void *b){   // 升序排序
	return((struct element*)a)->data - ((struct element*)b)->data;
}
bool lianxu(vector<string> _ss){
    for(int i=0;i<_ss.size()-2;i++){
        if(_ss[i]==_ss[i+1]&&_ss[i+1]==_ss[i+2]){
            return 1;
        }
    }
    return 0;
}

缺点:没有应用任何限制来产生随机排序,当n和m较大时,耗时可能较长。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值