常見程式演算:: 排列 - OpenHome.cc

文章推薦指數: 80 %
投票人數:10人

將一組數字、字母或符號進行排列,以得到不同的排列順序,例如1 2 3 這三個數的排列有1 2 3、1 3 2、2 1 3、2 3 1、3 1 2、3 2 1。

解法思路如果. OPENHOME.CC 常見程式演算 |老掉牙 河內塔 費氏數列 巴斯卡三角形 三色旗 老鼠走迷宮 騎士走棋盤 八皇后 八銀幣 康威生命遊戲 字串比對 背包問題 雙色、三色河內塔 得分排行 |「數」 最大訪客數 Eratosthenes篩選求質數 完全數 阿姆斯壯數 大數運算 指定位數的圓周率 |隨機 蒙地卡羅法求PI 洗牌 Craps賭博遊戲 約瑟夫問題 |組構 排列 格雷碼 子集 k組合 因數分解 加法因子 |排序 選擇、插入、氣泡排序 Heap排序-改良的選擇排序 Shell排序-改良的插入排序 Shaker排序-改良的氣泡排序 快速排序(一) 快速排序(二) 合併排序 基數排序 |搜尋 線性搜尋 二分搜尋 插補搜尋 費氏搜尋 |矩陣 稀疏矩陣 多維矩陣降維 上/下三角、對稱矩陣 奇數魔方陣 4N魔方陣 2(2N+1)魔方陣 |運算 中序式轉後序式 後序式運算 Quine GitHub Twitter Facebook LinkedIn 2DDesigns 3DDesigns Tags BuiltwithbyHugo HOME> 常見程式演算> 組構> 排列 解法思路 程式實作 permutation C Java Python Scala Ruby JavaScript Haskell 排列 December7,2021 將一組數字、字母或符號進行排列,以得到不同的排列順序,例如123這三個數的排列有123、132、213、231、312、321。

解法思路 如果是12,將兩個旋轉就得到新排列21。

如果是123,想得到2開頭的排列,可以從123將2拿到前頭得到213,想得到3開頭的排列,可以將3拿到前頭,得到3開頭的312。

可以觀察到,從123得到213,其實就是將開頭的12旋轉,從123得到312,就是將123旋轉。

如果這樣的旋轉可以得到新排列,那麼對於123、213、312的尾數列23、13、12也做相同旋轉處理,就可以得到尾數列的新排列。

也就是: 以上紅色部份表示對整個數列旋轉處理,底線表示對尾數列旋轉處理,也就是對尾數列進行相同動作,這在程式上就是遞迴處理。

因此對於任意長度的符號數列排列時,可對傳入數列旋轉處理,旋轉間隔一開始是0,逐步增加,對旋轉過後的每個數列之尾數列再排列。

例如對於1234: 1234->旋轉1為1,遞迴處理234 2134->旋轉12為21,遞迴處理134 3124->旋轉123為312,遞迴處理124 4123->旋轉1234為4123,遞迴處理123 程式實作 C Java Python Scala Ruby JavaScript Haskell #include #include #defineN4 voidperm(int*,int,void(*)(int*)); voidrotate(int*,int,int); voidcopy(int*,int*); voidprint(int*); intmain(void){ intnum[N]={1,2,3,4}; perm(num,0,print); return0; } voidperm(int*num,inti,void(*take)(int*)){ if(ii;k--){ num[k]=num[k-1]; } num[i]=tmp; } voidcopy(int*from,int*to){ inti; for(i=0;iListrotatedTo(inti,Listlist){ Listrotated=newArrayList<>(); rotated.add(list.get(i)); rotated.addAll(list.subList(0,i)); rotated.addAll(list.subList(i+1,list.size())); returnrotated; } publicstaticList>allRotated(Listlist){ List>allRotated=newArrayList<>(); for(inti=0;iList>perm(Listlist){ List>pls=newArrayList<>(); if(list.isEmpty()){ pls.add(newArrayList()); }else{ for(Listlt:allRotated(list)){ for(ListtailPl:perm(lt.subList(1,lt.size()))){ Listpl=newArrayList<>(); pl.add(lt.get(0)); pl.addAll(tailPl); pls.add(pl); } } } returnpls; } publicstaticvoidmain(String[]args){ for(Listpl:perm(Arrays.asList(1,2,3,4))){ System.out.println(pl); } } } fromfunctoolsimportreduce defallRotated(list): defrotatedTo(i): return[list[i]]+list[0:i]+list[i+1:] return[rotatedTo(i)foriinrange(len(list))] defperm(list): iflist==[]: return[[]] else: lts=allRotated(list) returnreduce(lambdaa,b:a+b, [[[lt[0]]+plforplinperm(lt[1:])]forltinlts]) forlistinperm([1,2,3,4]): print(list) defallRotated[T](list:List[T])={ defrotatedTo(i:Int)={ list(i)::(list.take(i)++list.drop(i+1)) } (for(i(i){ [list[i]]+list.take(i)+list.drop(i+1) } (0...list.size).map{|i|rotatedTo.call(i)} end defperm(list) iflist==[] [[]] else lts=allRotated(list) lts.map{|lt| perm(lt.drop(1)).map{|pl|[lt[0]]+pl} }.reduce(:+) end end perm([1,2,3,4]).eachdo|list| printf("%s\n",list) end functionallRotated(list){ functionrotatedTo(i){ varrotated=[]; rotated.push(list[i]); returnrotated.concat(list.slice(0,i)) .concat(list.slice(i+1,list.length)); } varall=[]; for(vari=0;i



請為這篇文章評分?