在笔试面试中经常会遇到求排列组合的题目(或者需求),现在将它们做一个总结。
1.排列数公式与组合数公式
2.思路
参考程序员面试宝典P112,求9位数能被整除的问题(具体请自己去看书),实际上的思路就是利用一个bool型数组记录被占用的位置,DFS求解。这里想指出STL有next_permutation方法。
vector<string> res;
void dfs(int pos, int count, int n, int k, vector<char> data, vector<bool> isUsed)
{
if (count == k) {
string tmp;
for (int i = 0; i < n; i++) {
if (isUsed[i] == true)
tmp.push_back(data[i]);
}
res.push_back(tmp);
return;
}
if (pos == n)
return;
if (isUsed[pos] == false) {
isUsed[pos] = true;
dfs(pos + 1, count + 1, n, k, data, isUsed);
isUsed[pos] = false;
}
dfs(pos + 1, count, n, k, data, isUsed);
}
vector<string> res2;
void Perm(int start, int end, vector<char> data) {
if (start == end) {
string tmp;
for (int i = 0; i < end; i++)
tmp.push_back(data[i]);
res2.push_back(tmp);
return;
}
for (int i = start; i < end; i++) {
swap(data[start], data[i]);
Perm(start + 1, end, data);
swap(data[i], data[start]);
}
}
int main() {
vector<char> data{ 'a','b','c','h' };
vector<bool> isUsed(data.size(), false);
int n = data.size(); int k; cin >> k;
dfs(0, 0, n, k, data, isUsed);
do {
for (vector<char>::iterator it = data.begin(); it!= data.end();it++)
{
cout << *it << " ";
}
cout << endl;
} while (next_permutation(data.begin(), data.end()));
Perm(0, n, data);
return 0;
}