大家好,我对C编码很陌生,但我正在学习这门课程。
我想写一段代码,找出数组中r个元素的组合,然后对结果进行置换。
我已经能够从各种来源进行研究,并有单独的代码,将打印组合和排列的数组。
我面临的挑战是如何将两个代码结合起来并使其作为一个整体工作。
第一个代码用于 5 个元素数组的组合,其中一次选择 4 个元素。
/*C++ program to print all combination of size r in an array of size n*/
#include <iostream>
using namespace std;
void combinationUtil(string arr[], string data[],
int start, int end,
int index, int r);
/*The main function that prints all combinations of size r in arr[] of
size n. This function mainly uses combinationUtil()*/
void printCombination(string arr[], int n, int r)
{
/*A temporary array to store all combination one by one*/
string data[r];
/*Print all combination using temporary array 'data[]'*/
combinationUtil(arr, data, 0, n-1, 0, r);
}
/*arr[] ---> Input Array
data[] ---> Temporary array to
store current combination
start & end ---> Starting and
Ending indexes in arr[]
index ---> Current index in data[]
r ---> Size of a combination to be printed */
void combinationUtil(string arr[], string data[],
int start, int end,
int index, int r)
{
if (index == r)
{
for (int j = 0; j < r; j++)
cout << data[j] << " ";
cout << endl;
return;
}
/*replace index with all possible elements. The condition "end-i+1 >= r-index"
makes sure that including one element at index will make a combination
with remaining elements at remaining positions*/
for (int i = start; i <= end &&
end - i + 1 >= r - index; i++)
{
data[index] = arr[i];
combinationUtil(arr, data, i+1,
end, index+1, r);
}
}
// Driver code
int main()
{
string arr[] = {"Red", "Orange", "Green", "Blue", "Indigo"};
int r = 4;
int n = sizeof(arr) / sizeof(arr[0]);
printCombination(arr, n, r);
}
第二个代码是排列数组组合(前一个代码)的每个结果,这意味着4个元素的排列。在下面的这段代码中,使用了第一个代码的第一行结果的排列。
#include <iostream>
#include <string>
using namespace std;
// Function to display the array
void display(string a[], int n)
{
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
}
// Function to find the permutations
void findPermutations(string a[], int n)
{
// Sort the given array
sort(a, a + n);
// Find all possible permutations
cout << "Possible permutations are:\n";
do {
display(a, n);
} while (next_permutation(a, a + n));
}
// Driver code
int main()
{
string a[] = { "Red", "Orange", "Green", "Blue"};
int n = sizeof(a) / sizeof(a[0]);
findPermutations(a, n);
return 0;
}
总之,需要一个代码来查找单词数组的组合以及组合结果的每一行排列。
你有两段代码,每一段都打印一些数据。你想连接它们。一种方法是更改一段代码,将数据存储在某种数据结构中,而不是打印。然后更改另一段代码以获得此数据结构,并处理其内容。
这就引出了数据结构的想法,C有std::向量
,这是一个大小可变的数组,这是C中非常简单和最有用的数据结构,向量
的元素可以有任何特定类型,包括向量
,它允许使用嵌套列表(见下文)。
更改您的< code>printCombination函数以返回< code>std::vector而不是< code>void(同时适当更改其名称):
std::vector<std::vector<std::string>>
findCombinations(std::vector<std::string> strings, int r)
{
...
}
我省略了实现,因为我想在回答中专注于接口。
注意,这个函数的返回类型是< code>std::vector
然后更改您的查找排列
以使用 std::vector
而不是数组接收其数据。
void findPermutations(std::vector<std::string> a)
{
...
}
(为简洁起见,我省略了引用传递)
然后让“driver”函数调用第一个函数,并将其输出传递给第二个函数:
// Driver code
int main()
{
std::vector<std::string> arr{"Red", "Orange", "Green", "Blue", "Indigo"};
int r = 4;
auto combinations = findCombinations(arr, r);
for (auto combination: combinations)
findPermutations(combination);
}
(为了简洁起见,我省略了for循环中的引用传递)
问题 你想迭代遍历一个集合中元素的所有可能的排列或组合 解决方案 itertools模块提供了三个函数来解决这类问题。 其中一个是 itertools.permutations() , 它接受一个集合并产生一个元组序列,每个元组由集合中所有元素的一个可能排列组成。 也就是说通过打乱集合中元素排列顺序生成一个元组,比如: >>> items = ['a', 'b', 'c'] >>> from it
排列 下一个排列 LeetCode - 31. 下一个排列 题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。 必须原地修改,只允许使用额外常数空间。 以下是一些例子,输入位于左侧列,其相应输出位于右侧列。 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5
我试图从黑莓的本机日历中读取“day”值,该值以整数形式返回,并映射到一周中每一天的值。这些值如下所示: 周一:32768 星期二:16384 周三:8192 周四:4096 周五:2048 sat:1024 孙:65536 如果事件发生在一天内,我可以看到值是否为mon/tue/we/thu/fri/sat/sun 值也与星期一值相同。 现在的问题是,如果事件发生在两天或三天以上 返回所选天数的
我做了一个代码,应该显示数组中元素排列的整个组合。 应该是什么: 123 213 231 132 312 321 但结果是这样的: 231 312 123 231 312 123 如何以应有的方式进行排列?
本文向大家介绍C程序找到nCr和nPr.排列组合,包括了C程序找到nCr和nPr.排列组合的使用技巧和注意事项,需要的朋友参考一下 在C编程语言中,nCr被称为组合。nCr是从n个对象集中选择r个对象,其中对象的顺序无关紧要。 nPr称为置换。nPr是一组“ n”个对象中“ r”个对象的排列,其顺序或顺序应相同。 排列和组合公式 在C语言中找到给定数字的排列和组合的公式如下- nCr = n!/(
本文向大家介绍java数组排列组合问题汇总,包括了java数组排列组合问题汇总的使用技巧和注意事项,需要的朋友参考一下 面试或笔试中,多次遇到以下4个关于排列组合的手撕算法,这里做个笔记,方法日后查阅: 1. 无重复元素的数组,求全排列; 2. 有重复元素的数组,求全排列; 3. 无重复元素的数组,求组合【子集】; 4. 有重复元素的数组,求组合; 以上四类题,可以用统一的模板实现,如下所示: 以