我有一个ArrayList [] myList,我正在尝试创建一个列表,列出数组中值的所有排列.
示例:(所有值均为字符串)
myList[0] = { "1", "5", "3", "9" };
myList[1] = { "2", "3" };
myList[2] = { "93" };
Run Code Online (Sandbox Code Playgroud)
myList的计数可以变化,因此事先不知道它的长度.
我希望能够生成一个类似于以下所有排列的列表(但有一些额外的格式).
1 2 93
1 3 93
5 2 93
5 3 93
3 2 93
3 3 93
9 2 93
9 3 93
Run Code Online (Sandbox Code Playgroud)
这是否理解我想要完成的事情?我似乎无法想出这样做的好方法,(如果有的话).
编辑:
我不确定递归是否会干扰我以自己的方式格式化输出的愿望.对不起我之前没有提到我的格式.
我想最终构建一个string []数组,其中包含如下格式的所有组合:
对于"1 2 93"排列
我希望输出为"val0 = 1; val1 = 2; val2 = 93;"
我现在将尝试递归.谢谢Dr.Jokepu
我希望采用任意数量的列表(例如[2,1,4 ...],[8,3,...],...)并从每个列表中选择数字以生成所有排列.例如:
[2,8,...],[2,3,...],[1,8,...],[1,3,...],[4,8,...], [4,3,...],......
这可以使用嵌套的for循环轻松完成,但由于我希望它接受任意数量的列表,似乎for循环必须是硬编码的.每个列表一个.此外,由于我的程序可能会产生数万个排列,我想一次生成一个单独的排列(而不是一次性计算它们并将结果存储到向量中).有没有办法以编程方式完成此操作?
由于在编译时知道列表的数量,我想也许我可以使用基于模板的元编程.然而,这看起来很笨拙,也不符合"一次一个"的要求.有什么建议?
我有一串字母,我想分成所有可能的组合(字母的顺序必须保持固定),这样:
s = 'monkey'
Run Code Online (Sandbox Code Playgroud)
变为:
combinations = [['m', 'onkey'], ['mo', 'nkey'], ['m', 'o', 'nkey'] ... etc]
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
这是打印字符串字符排列的标准函数:
void permute(char *a, int i, int n)
{
int j;
if (i == n)
printf("%s\n", a);
else
{
for (j = i; j < n; j++) //check till end of string
{
swap((a+i), (a+j));
permute(a, i+1, n);
swap((a+i), (a+j)); //backtrack
}
}
}
void swap (char *x, char *y)
{
char temp;
temp = *x;
*x = *y;
*y = temp;
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但有一个问题,它还打印一些重复的排列,exapmle:
如果字符串是"AAB"
输出是:
AAB
ABA
AAB
ABA
BAA
BAA
Run Code Online (Sandbox Code Playgroud)
这也有3个重复的条目.
有没有办法防止这种情况发生?
-
谢谢
Alok Kr.
经典的Fisher Yates看起来像这样:
void shuffle1(std::vector<int>& vec)
{
int n = vec.size();
for (int i = n - 1; i > 0; --i)
{
std::swap(vec[i], vec[rand() % (i + 1)]);
}
}
Run Code Online (Sandbox Code Playgroud)
昨天,我错误地"向后"实现了迭代:
void shuffle2(std::vector<int>& vec)
{
int n = vec.size();
for (int i = 1; i < n; ++i)
{
std::swap(vec[i], vec[rand() % (i + 1)]);
}
}
Run Code Online (Sandbox Code Playgroud)
这个版本是否比第一个版本更糟(或更好)?它是否会扭曲由此产生的概率?
给定一个数组说"bca",我需要找到排列数量大于给定排列的排列数.
因此,在该示例中,cab,cba是更大的排列.因此答案是2.
我尝试通过查找数组的词典排名来解决问题,但我无法为说法设计一个有效的算法.
任何帮助/指针在正确的方向是值得赞赏的!
我正在尝试安排tic tac toe board.所以我有以下代码:
// 5 turns for x if x goes first
std::string moves = "xxxxxoooo";
do {
std::cout << moves << std::endl;
} while ( std::next_permutation(moves.begin(), moves.end()) );
Run Code Online (Sandbox Code Playgroud)
但它只输出一次原始字符串.我假设每个角色都必须是唯一的.我能做到这一点的方式是什么?
我知道我可以使用itertools.permutation来获得大小为r的所有排列.但是,对于itertools.permutation([1,2,3,4],3)它将返回(1,2,3)以及(1,3,2).
我想过滤那些重复(即获得组合)
是否有一种简单的方法来获得所有排列(所有长度)?
如何将itertools.permutation()结果转换为常规列表?
我的编程经验非常少.
我想编写一个程序,生成并保存为gif图像的每个可能的图像,只能使用640 x 360像素尺寸的黑白像素.
换句话说,每个像素可以是黑色或白色.640 x 360 = 230,400像素.所以我相信总共可以生成460,800张图像(黑色/白色为230,400 x 2).
我想要一个程序自动执行此操作.
请帮忙!
假设我们有n投掷k球的垃圾箱.什么是快速(即使用numpy/scipy而不是python代码)方式来生成所有可能的结果作为矩阵?
例如,如果n = 4和k = 3,我们需要以下内容numpy.array:
3 0 0 0
2 1 0 0
2 0 1 0
2 0 0 1
1 2 0 0
1 1 1 0
1 1 0 1
1 0 2 0
1 0 1 1
1 0 0 2
0 3 0 0
0 2 1 0
0 2 0 1
0 1 2 0
0 1 1 1
0 1 …Run Code Online (Sandbox Code Playgroud)