栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

第N个组合({a,b} = {b,a})无重复(枚举/蛮力)

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

第N个组合({a,b} = {b,a})无重复(枚举/蛮力)

您可以使用以下递归方法执行此操作:

public static<T> ArrayList<ArrayList<T>> getPermutations (List<T> elements, int k) {    return getPermutations (elements,k,0);}public static<T> ArrayList<ArrayList<T>> getPermutations (List<T> elements, int k, int i) {    ArrayList<ArrayList<T>> results = new ArrayList<>();    if(k > 0) {        int n = elements.size();        for(int j = i; j <= n-k; j++) { T val = elements.get(j); ArrayList<ArrayList<T>> tails = getPermutations(elements,k-1,j+1); for(ArrayList<T> tail : tails) {     ArrayList<T> result = new ArrayList<>();     result.add(val);     result.addAll(tail);     results.add(result); }        }    } else {        results.add(new ArrayList<T>());    }    return results;}

然后,您可以使用(jDoodle)运行它:

ArrayList<Character> set = new ArrayList<>();set.add('a');set.add('b');set.add('c');for(ArrayList<Character> element : getPermutations(set,2)) {    System.out.println(element);}System.out.println("----------");for(ArrayList<Character> element : getPermutations(set,3)) {    System.out.println(element);}System.out.println("----------");set.add('d');for(ArrayList<Character> element : getPermutations(set,2)) {    System.out.println(element);}System.out.println("----------");for(ArrayList<Character> element : getPermutations(set,3)) {    System.out.println(element);}

会产生:

[a, b][a, c][b, c]----------[a, b, c]----------[a, b][a, c][a, d][b, c][b, d][c, d]----------[a, b, c][a, b, d][a, c, d][b, c, d]

该程序的工作方式如下:

k
是仍要选择的元素数,
i
是当前的偏移值。最初,偏移值是
0

现在,我们从迭代

i
n-k
寻找潜在的候选人是头部的一部分。该范围内的每个元素将成为某些组合的开头。我们对列表的其余部分执行递归。递归生成所有在列表的其余部分上包含
k-1个 元素的列表。然后,我们的工作只是简单地在前面添加一个头并返回列表。

通过使用特殊形式的

linkedList
s(在逻辑和函数编程语言中很常见),可以更快地实现此目标,并且可以使存储保守性更高。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/509536.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号