對(duì)于這個(gè)問題,我首先需要糾正一下樓主的措辭,這是個(gè)組合問題,跟排列無關(guān),用排列組合亦不恰當(dāng)。下面說下我的想法
創(chuàng)新互聯(lián)專注于桓臺(tái)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供桓臺(tái)營銷型網(wǎng)站建設(shè),桓臺(tái)網(wǎng)站制作、桓臺(tái)網(wǎng)頁設(shè)計(jì)、桓臺(tái)網(wǎng)站官網(wǎng)定制、微信小程序定制開發(fā)服務(wù),打造桓臺(tái)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供桓臺(tái)網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
元素不能重復(fù),首先應(yīng)該去掉相同的元素,最好的辦法是用set來實(shí)現(xiàn)。參考api
Arrays.asList
set.addAll
其實(shí)呢,這個(gè)是一個(gè)遞歸的過程,考慮下面情況
對(duì)于數(shù)組
{“1”},它的組合數(shù)就是{“1”}。
如果再加上一個(gè)元素“2“到上面的數(shù)組中,那么,如果這個(gè)”2“不用,實(shí)質(zhì)上跟{"1"}的情況是一樣的,這與不能重復(fù)相矛盾,所以”2“一定要用,就是在"1"中再加上”2“;于是我們得到
對(duì)于數(shù)組{”1“,”2“}它的組合數(shù)是{”1“}
再加入一個(gè){”2“}。也許你也考慮到另外一種情況,即”2“也是它的一個(gè)組合數(shù),我們考慮丟了,為什么呢,因?yàn)樵趝”1“}中實(shí)質(zhì)上還有一個(gè)稱為空的集合。這樣的話,重新整理一下:
1.對(duì)于list
=
{"1"},它的組合包括
{"1"},以及
empty.
2.對(duì)于list={"1","2"},它的組合包括{”1“,”2“}(在{”1“}中加了”2“),{”2“}(在empty中加入”2“),也許你還會(huì)講還應(yīng)該包括{”1“},但是這個(gè){”1“}我們已經(jīng)在第1步就已經(jīng)算出來了,不用再考慮了。
按照這樣的規(guī)則進(jìn)行下去,你會(huì)發(fā)現(xiàn)這樣就把所有的組合數(shù)遍歷出來了。要具體的代碼就等會(huì)兒,我現(xiàn)在有事。
ArrayListCharacter
newblist=new
ArrayListCharacter(blist);
是用blist的值創(chuàng)建一個(gè)新的ArrayList
如果
newblist
=
blist;這樣,那兩個(gè)ArrayList使用的是同一個(gè)引用,操作一個(gè)會(huì)影響另一個(gè)。
------------------------------------------------------------------------------------------------------------------------
這個(gè)代碼的遞歸思想是這樣的。
alist是數(shù)據(jù),blist是結(jié)果
循環(huán)alist,創(chuàng)建出一個(gè)newalist備份,將alist中的一個(gè)元素添加到newblist.add(alist.get(i));中,
并在newalist中刪除。
將這兩個(gè)新的對(duì)象遞歸下去。
[1,2,3]
[]
[2,3]
[1]
[3]
[1,2]
--------------------
遞歸使用的是新創(chuàng)建的list
所以方法結(jié)束后,對(duì)alist,blist沒有影響
[2,3]
[1]
[2]
[1,3]
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 創(chuàng)建Scanner對(duì)象,用于獲取用戶輸入
Scanner scanner = new Scanner(System.in);
System.out.print("請(qǐng)輸入任意字符序列:");
// 獲取用戶輸入的字符序列
String str = scanner.nextLine();
// 循環(huán)遍歷字符序列中的每個(gè)字符
for (int i = 0; i str.length(); i++) {
// 獲取字符序列中的第i個(gè)字符
char c1 = str.charAt(i);
// 循環(huán)遍歷字符序列中的每個(gè)字符
for (int j = 0; j str.length(); j++) {
// 獲取字符序列中的第j個(gè)字符
char c2 = str.charAt(j);
// 如果第i個(gè)字符不等于第j個(gè)字符,則輸出它們的排列
if (i != j) {
System.out.println(c1 + "" + c2);
}
}
}
}
}