有没有一个函数像next_placement,但对于具有重复的排列
Is there a function like next_permutation but for permutations with repetition?
我想做的是找到一个一维数组的每个内容重复的排列。
例如
int array[]={1,2,3};
for(i=0;i<3;i++){
next_permutation(array,array+3)
for(int j=0;j<=3;j++){
printf("%d ",array[j]);
}
printf("n");
}
将返回:
1 2 3
1 3 2
2 1 3
etc...
我希望函数返回的内容:
1 1 1
1 1 2
1 2 1
2 1 1
1 2 2
2 2 1
2 1 2
1 1 3
1 3 1
3 1 1
etc...
有什么函数可以做到这一点吗?
提前感谢,Erik
您不是在进行排列,而是在计数。
Ex。如果您的枚举集{0,1}超过3位,您将得到:
000
001
010
011
100
101
110
111
看,这只是二进制计数。
因此,将元素集映射为n位数字,然后进行基于n的计数将为您提供正确的awnser
我用Java编写了这篇文章
未优化的代码,但你明白了:
String [] data = {"1","2","3"};
public void perm(int maxLength, StringBuffer crtComb){
if (crtComb.length() == maxLength){
System.out.println(crtComb.toString());
return;
}
for (int i=0; i<data.length; i++){
crtComb.append(data[i]);
perm(maxLength, crtComb);
crtComb.setLength(crtComb.length()-1);
}
}
通常计算从1到k的整数排列(带重复)时:
-
最初将第一个排列设置为1 1 1。。。。(k次)。
-
找到最右边的索引(比如j),使得该索引处的元素小于k。
-
将索引j处元素的值增加一,从位置j+1到k,将所有元素重置为1。
-
重复步骤2和3。
应用这个逻辑,我们现在得到:
第一次排列->1 1 1。
然后在位置2(0索引计数),我们有1<3,因此将其递增,并在此之后将所有元素重置为1。第二次排列->1 1 2。
然后在位置1(0索引计数),我们有1<3,因此将其递增,并在此之后将所有元素重置为1。第三次排列->1 2 1
等等。
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么不;名字在地图上是按顺序排列的吗
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- c++r值引用应用于函数指针
- 按对象的特定方法按升序排列的C++优先级队列
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 如何仅使用对象名称打印特定于对象的成员
- 相当于LocaleMatcher的ICU4C
- 等<thing>效于char32_t
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 类似于strcat()的函数出现问题
- 如何将C++闭包与变量参数同时重用——类似于JavaScript
- 算术运算的结果类似于:C浮点变量中的1/3
- 找到具有最多子串栅栏的字符串排列
- 相当于 pybind11 中的 boost::p ython py::scope().attr()
- 重新排列单线以形成闭合多边形?
- 如何将记忆应用于此递归函数?
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- 类模板,独立于其参数的排列