我很好奇如何std:next_permutation
实现,所以我提取了gnu libstdc++ 4.7
版本并清理了标识符和格式以生成以下演示...
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
template<typename It>
bool next_permutation(It begin, It end)
{
if (begin == end)
return false;
It i = begin;
++i;
if (i == end)
return false;
i = end;
--i;
while (true)
{
It j = i;
--i;
if (*i < *j)
{
It k = end;
while (!(*i < *--k))
/* pass */;
iter_swap(i, k);
reverse(j, end);
return true;
}
if (i == begin) …
Run Code Online (Sandbox Code Playgroud) 我正在研究一个程序,我有一个函数可以交换用户输入的长度数组中的位置.但是,我想弄清楚如何打印出这个函数调用N!times,列出函数中的所有排列.
我的置换函数代码是:
static void nextPerm(int[] A){
for( int i = (n-1); i > 0; i-- ){
if( A[i] < A[i+1] ){
A[i] = pivot;
continue;
}
if( A[i] >= A[i+1] ){
reverseArray(A);
return;
}
}
for( int i = n; i > 0; i--){
if( A[i] > pivot ){
A[i] = successor;
continue;
}
}
Swap(pivot, successor);
int[] B = new int[pivot+1];
reverseArray(B);
return;
}
Run Code Online (Sandbox Code Playgroud)
我应该在函数main中编写一个循环,这将打印出来!次?
可能重复:
生成给定字符串的所有排列
我在Java中有一个任意长度的数组,我想生成它们的所有可能的排列.对固定长度执行此操作的简单方法是一系列嵌套for循环,但由于数组长度未知,因此这不是一个选项.在Java中有没有一种直接的方法来实现这一目标?
我有一个字符数组c [] [],每个索引都有不同的映射.例如:
{'a', 'b', 'c', 'd', 'e', 'f' } {'g', 'h', 'i' }
Run Code Online (Sandbox Code Playgroud)
我需要将此数组的所有可能字符组合作为字符串返回.这意味着,对于上面的字符数组,我应该返回:"ag","ah","ai","bg","bh","bi","cg","ch","ci"等对于只有两个像上面这样的东西的字符数组来说很容易做到这一点,但是如果有更多的数组,那么我不知道该做什么......我要求大家帮助我!:)
我的数字为x,y,z和w.我试图以24小时格式创建最大可能时间.例:
我的方法是对所有数字进行排序.然后数小时检查小于等于2的数字,然后检查小时的下一个数字,检查小于等于4的数字,依此类推几分钟.(0-60分钟)
除了暴力解决方案,还有其他任何有效的方法吗?
我有一些复杂的计算算法,基本上测试一些较小的矩阵是否适合另一个大矩阵.
如果它们都适合大矩阵,它取决于较小矩阵的顺序.如果小矩阵不适合,则应重新排列ArrayList并再次尝试,直到测试了所有可能的顺序/序列.
如果我有5个小矩阵,那么总共有5个!(= 120)阵列可能具有的可能顺序.
我的问题是我不知道如何重新排列这些对象(矩阵),所以我可以测试每个可能的顺序.我希望有人可以帮助我吗?
我正在尝试编写一个返回一个ArrayList<ArrayList<String>>
包含较小ArrayLists的大型方法的方法,每个ArrayLists都有一个不同的起始ArrayList排列.
这是我的方法:
public static ArrayList<ArrayList<String>> permute(ArrayList<String> x) {
ArrayList<ArrayList<String>> res = new ArrayList<ArrayList<String>>();
while (res.size() < fac(x.size())) { //fac method works fine
Collections.shuffle(x);
if (!res.containsAll(x)) {
res.add(x);
}
}
return res;
}
Run Code Online (Sandbox Code Playgroud)
我的方法是基本上重新调整原始的ArrayList,x,并检查它是否已经在结果ArrayList中,如果不是,那么我添加它.出于某种原因,当我尝试这个方法时,结果ArrayList包含相同的ArrayLists,即使我有一个if语句,这是特定的,所以不会发生.
我错过了什么?