一道演算法題——8選6全排列
阿新 • • 發佈:2018-11-10
在網上看到一道題目:給定一個字串包含8組元素,任取其中六組進行全排列。
例如: string str = "01 02 03 04 05 06 07 08"; 從中輸出所有由其中六個組成的序列。
思路:是用2進位制來表示這個字串的所有排列情況, 對每一位為1則輸出,如11111100則是010203040506;而最小的是00111111;
程式碼如下:
//8選6的全排列 public static void FullArrangement() { string str = "01 02 03 04 05 06 07 08"; string[] nstr = str.Split(' '); int tar = 6; //目標選擇6個 int m = (0x01<<6)- 1; // 00111111; int n = m << 2; // 11111100; for (int i = m; i <= n; i++) { int k = i; //儲存i; int temp = 1; //用來比較k的每一位是否為1; int len = 0; //記錄每一次迴圈的i中有多少個1; int index = 0; while (index < 8) { if ((k & temp) == temp) { //對k的每一位判斷是否為1 len++; } index++; //Console.WriteLine(len); temp <<= 1; //temp進位來匹配k的每一位 if (len > 6) break; } //如果相等則當前i 總共有6個1,則進行輸出 if (len == tar) { int current = 1; //對i的每一位進行判斷是否為1 for (int j = 0; j < str.Length; j++) { if ((i & current) == current) { Console.Write(nstr[j] + " "); } current <<= 1; } Console.WriteLine(); } } }