ArrayList Java中元素的k排列

时间:2018-10-15 14:49:58

标签: java permutation

我正在寻找一种简单的方法来在一个ArrayList中获得元素的k排列。

我有一个对象X的arrayList,我想基于值k获取元素的所有可能排列(顺序计数)。

到目前为止,我发现数组元素仅是所有元素的组合和排列(主要是整数值),而没有对象的k排列的解。

有人可以帮助我吗?

到目前为止,我发现了这一点,但是我不知道如何适应我的情况:

 public static void perm2(String s, int k)
    {
    perm2("", s, k);
    }
    public static void perm2(String prefix, String s, int k)
    {
    int N = prefix.length();

    int M = s.length();

    if(N == k) System.out.println(prefix);
    else
        {
        for(int i = 0; i < M; i++)
            perm2(prefix+s.charAt(i), s.substring(0, i) + s.substring(i+1, M), k);
        }
    }
    public static void main(String[] args)
    {
    String alphabet = "123";
    int N = alphabet.length();
    int K = 2;
    String elements = alphabet.substring(0, N);
    perm2(elements, K);
    }

2 个答案:

答案 0 :(得分:0)

好吧,很多话。根据标题,您希望获得给定数组的k-th有序排列。

示例。

  • 初始数组:abcde
  • 第0 abcde
  • 第一名abced
  • 最后edcba
  • 您需要找到kth排列

您有两种解决方法:

  1. 手动实施词汇排序,并在第k个排列上进行迭代。这需要 O(n)时间;
  2. 您可以使用Factorial number systems,它可以在 O(1)时间内解决此问题。

答案 1 :(得分:0)

据我了解,您想根据长度为k的{​​{1}},其中List来生成n元素的所有排列。

n >= k

测试:

static <E> void permK(List<E> p, int i, int k)
{
  if(i == k)
  {
    System.out.println(p.subList(0, k));
    return;
  }

  for(int j=i; j<p.size(); j++)
  {
    Collections.swap(p, i, j);
    permK(p, i+1, k);    
    Collections.swap(p, i, j);
  }
}

输出:

public static void main(String[] args)
{
  permK(new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5)), 0, 3);
}