码迷,mamicode.com
首页 > 编程语言 > 详细

排列组合之组合问题 网易深度学习工程师面试题 C++ 使用10方法

时间:2018-08-11 22:06:52      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:==   --   iostream   fine   def   交换   网易   面试题   bin   

#include <iostream>
#include <vector>
#include <cstdio>

#define UL unsigned long int

using namespace std;


// 后r个全是1的时候终止
bool hasDone(vector<int>& index, int r){
    for(auto i=index.size()-r; i < index.size(); i++){
        if(index[i] == 0) return false;
    }
    return true;
}


vector<int> combination_justk(int n, int r, int k){
    vector<int> index((UL)n, 0);
    // 设置初始index, 前k个设置为1, 即r个1, n-r个0
    for(int i=0;i<r;i++){
        index[i] = 1;
    }
    // 记录初始组合
    while(!hasDone(index, r)){
        k--;
        for(int i=0;i<index.size()-1;i++){
            // 找到10的时候,交换10变成01
            if(index[i] == 1 && index[i+1] == 0){
                index[i] = 0;
                index[i+1] = 1;
                // 将i左边的序列恢复成最小的状态,即前面是1后面是0
                int left_one_num=0;
                for(int j=0;j<i;j++){
                    if(index[j] == 1){
                        index[j] = 0;
                        index[left_one_num++] = 1;
                    }
                }
                if(k-1==0){
                    return index;
                }
                else{
                    break;
                }
            }
        }
    }
    return {};
}

void netease_test(int n, int m, int k){
    if(n<=0 || m<=0 || k<=0) return;
    auto index = combination_justk(n+m, n, k);
    for(auto i:index){
        if(i==1){
            cout << ‘a‘;
        }
        else{
            cout << ‘z‘;
        }
    }
    cout << endl;
}

int main(int argc, char* argv[])
{
    netease_test(2, 2, 6);// zzaa
    return 0;
}

排列组合之组合问题 网易深度学习工程师面试题 C++ 使用10方法

标签:==   --   iostream   fine   def   交换   网易   面试题   bin   

原文地址:https://www.cnblogs.com/theodoric008/p/9461106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!