將一個數組中的行和列進行互換,應用場景:消消樂中找到橫豎排相連的3個相同的元素 (橫排好找,找到豎排中的相同元素就主要用到了行列互換)javascript
/** * 行列互換函數 * @param {array} arr 輸入的原始數組, 一維數組 * @param {Num} rowSize 每行的列個數 * @return {array} resultArr 新的數組 */ function changeXY(arr, rowSize) { var resultArr = [], iNow = 0; (function() { if (iNow == rowSize) return; for (var i = 0; i < arr.length; i++) { if (i % rowSize == iNow) { resultArr.push(arr[i]); } }; iNow++; arguments.callee(); })(); return resultArr; }
排列的樹形表示法 ![樹形表示法][1] /** * 排列函數 * @param Array arr 輸入數組 * @param Num num 取出的排列個數 * @return Array 前幾位表示排列的可能性,最後一位表示排列的狀況數 */ function arrange(arr, num) { var resultArr = [], resultNum = 0, iLayer = 1; //當前在第幾層 if (num == 1) { resultArr = arr.concat(); resultNum = arr.length; }; function change(arr, iLayer, str) { for (var i = 0; i < arr.length; i++) { var arrClone = arr.concat(); var strClone = str + arrClone.splice(i, 1); if (num == iLayer) { for (var j = 0; j < arrClone.length; j++) { resultArr.push(strClone + arrClone[j]); }; resultNum += arrClone.length; } else { change(arrClone, iLayer+1, strClone); } }; } //是從第二層開始執行,第一層經過for循環得出 change(arr, iLayer+1, ''); resultArr.push(resultNum); return resultArr; }
function A(m, n) { return f(m) / f(m-n); } function f(m) { if (m <= 1) return 1; return m * f(m-1); } console.log(A(3,1));
組合的樹形表達法:先採用排列的方式獲取可能的值而後過濾掉其中重複的值java
/** * 組合函數 * @param Array arr 輸入數組 * @param Num num 取出的組合個數 * @return Array 前幾位表示組合的可能性,最後一位表示排列的狀況數 */ function combination(arr, num) { var resultArr = [], resultNum = 0, iLayer = 1; //當前在第幾層 if (num == 1) { resultArr = arr.concat(); resultNum = arr.length; }; function change(arr, iLayer, str) { for (var i = 0; i < arr.length; i++) { var arrClone = arr.concat(); var strClone = str + arrClone.splice(i, 1); if (num == iLayer) { for (var j = 0; j < arrClone.length; j++) { resultArr.push(strClone + arrClone[j]); }; resultNum += arrClone.length; } else { change(arrClone, iLayer+1, strClone); } }; } //是從第二層開始執行,第一層經過for循環得出 change(arr, iLayer+1, ''); resultArr = unique(resultArr); resultArr.push(resultArr.length); return resultArr; } function unique(arr) { var validator = {}; var resultArr = []; for (var i = 0; i < arr.length; i++) { var key = arr[i].split('').sort().join(''); if (!validator[key]) { resultArr.push(arr[i]); validator[key] = 1; }; }; return resultArr; } console.log(combination(arr, 2));
/** * 組合的數學表示法 * C(m, n) = m! / ((m-n)! * n!) */ function C(m, n) { return f(m) / (f(m-n) * f(n)); } function f(m) { if (m <= 1) return 1; return m * f(m-1); } console.log(C(3,2));
有課學是一站式程序員專屬課程返現平臺,支持極客時間,慕課網、網易雲課堂、知識星球、小專欄。
【有課學,學好課,有所獲】程序員