Java8排列组合(6行代码实现)
发布时间:2025-05-20 05:44:02 发布人:远客网络
一、Java8排列组合(6行代码实现)
探索Java8中排列组合的实现,通过简洁的代码解决问题。初次尝试时,用四个for循环生成四个字的昵称排列组合,虽笨拙但充满学习乐趣。随后,阅读《Java实战(第2版)》时,发现能用代码处理集合组合的问题。由此,想到若两个集合都能组合,那么更多集合亦然。试验后,证实此想法可行。总结规律,得知生成N个字的组合需使用N-1个flatMap。进而,设计将N作为参数传递的函数,轻松实现生成任意数量字的排列组合。
处理含有重复字符串的排列组合,采用相应方法以包容多种可能性。紧接着,处理无重复字符串的排列组合,更显程序的精炼与高效。通过实践,验证了方法的正确性。最后,将此实现应用在力扣的面试题「08.07.无重复字符串的排列组合」中,展现出Java8简洁、直观的编程风格。此方法不仅便于理解,而且适合用于Java8的学习,帮助掌握集合操作与函数式编程的概念。
二、排列组合--原理及实现
组合数:从m个不同元素中任取n(n<=m)个元素拼成一组,叫做从m中取n个元素的组合。能够取的所有可能叫组合数。公式如下:
全排列:从m个不同元素中,任取n(n<=m)个元素按照一定顺序排列起来,叫做从m中取n个数的一个排列。当m=n时的所有排列情况,叫做全排列。
区别:排列可以看作是同样情况下组合的子集,由于需要按顺序排列,因此少了一些情况。
举例3个元素:a,b,c。所以一共有2^3=8个结果。所以i=0,1,2,3,...,7分别对应输出以上结果
将i转换为二进制i=1=001,i=2=010,i=3=011
1)j=0;1<<j=001与i=001相与返回1输出a
*从集合中依次选出每一个元素,作为排列的第一个元素,然后对剩余的元素进行全排列,如此递归处理
*从而得到所有元素的全排列。以对字符串abc进行全排列为例,我们可以这么做:以abc为例:
*固定a,求后面bc的排列:abc,acb,求好后,a和b交换,得到bac
*固定b,求后面ac的排列:bac,bca,求好后,c放到第一位置,得到cba
*固定c,求后面ba的排列:cba,cab。
result: abc acb bac bca cab cba
三、java 排列组合的01转换法的原理是啥啊
1、公式是C(n, m)= C(n- 1, m)+ C(n- 1, m- 1)
2、长为n,其中m个为1的序列,执行完毕共C(n, m)步
3、从开始执行直到第n位为1为止,这之前相当于把n-1的序列中移动m位,即C(n-1,m)
4、当第n位为1了,然后前面(n-1)位中包括m-1个1,把这m-1个数字从最左边移动到和第n位邻接。这个子问题是C(n-1,m-1)
5、这2步之后的状态就是将m个1移动到长n的序列的右端的状态。
6、即C(n, m)= C(n- 1, m)+ C(n-1, m-1).这个就是组合数的地推公式