摘要:獲取字符串中字符的全排列無重復去重回溯查找有環鏈表的入環節點
本文包括簡單的線性算法和一些數值計算,還會繼續更新
rgb 和 16進制互相轉換function rgb2hex(r,g,b){ return "#" + ((r<<16)+(g<<8)+b).toString(16); } function hex2rgb(str){ var arr = str.match(/[0-9a-f]{2}/ig); return { r: parseInt(arr[0], 16), g: parseInt(arr[1], 16), b: parseInt(arr[2], 16) }; }找出整型數組中乘積最大的三個數
var original_array = [-10, -7, -29, -4, -1, -10, -70]; var result = findMPTN(original_array); console.log(result); function findMPTN(arr){ //findMaxiumProductorOfThreeNumbers var len = arr.length; sorted_arr = arr.sort(function(a,b){return a-b;}); var pro1 = 1, pro2 = sorted_arr[len - 1]; for(var i = 1; i <= 3; i++){ pro1 *= sorted_arr[len - i]; } pro2 *= sorted_arr[0]; pro2 *= sorted_arr[1]; return pro1 > pro2 ? [sorted_arr[len - 3], sorted_arr[len - 2], sorted_arr[len - 1]] : [sorted_arr[0], sorted_arr[1], sorted_arr[len - 1]]; }判斷大括號是否閉合
var expression = "{{}}{}{}" var expressionFalse = "{}{{}"; console.log(isBalanced(expression)); // true console.log(isBalanced(expressionFalse)); // false console.log(isBalanced("")); // true function isBalanced(exp){ var stack = []; var arr = exp.split(""); var len = arr.length, cur; while(cur = arr.shift()){ if(cur === "{") stack.push(cur); if(cur === "}") stack.pop(); } if(stack.length !== 0) return false; return true; }使用兩個棧實現入隊與出隊
Array.prototype.enqueue = function(item){ return this.push(item); }; Array.prototype.dequeue = function(){ var tempStack = []; var cur, temp; while(cur = this.pop()){ tempStack.push(cur); } temp = tempStack.pop(); while(cur = tempStack.pop()){ this.push(cur); } return temp; };尋找連續數組中的缺失的多個數
var array = [2, 5, -1, 9, -6, 3, 7]; var result = findLost(array); console.log(result); function findLost(arr){ if(arr.length <= 1) return null; var sortedArr = arr.sort(function(a,b){return a-b;}); var i = sortedArr.shift(); var cur = sortedArr.shift(); var result = []; do{ i++; if(cur === i) cur = sortedArr.shift(); else result.push(i); }while(cur); return result; }數組中元素最大差值計算
給定某無序數組,求取任意兩個元素之間的最大差值,注意,這里要求差值計算中較小的元素下標必須小于較大元素的下標。
var array = [7, 8, 4, 9, 9, 15, 3, 1, 10]; var result = findLargestDifference(array); console.log(result); function findLargestDifference(arr){ var min = arr[0]; var diff = 0; for(var i = 1, len = arr.length; i < len; i++){ if(arr[i] < min){ min = arr[i]; continue; } if(arr[i] - min > diff){ diff = arr[i] - min; } } return diff; }數組中元素乘積
給定某無序數組,要求返回新數組 output ,其中 output[i] 為原數組中除了下標為 i 的元素之外的元素乘積,要求以 O(n) 復雜度實現:
var firstArray = [2, 2, 4, 1]; var secondArray = [0, 0, 0, 2]; var thirdArray = [-2, -2, -3, 2]; console.log(productExceptSelf(firstArray)); // [8, 8, 4, 16] console.log(productExceptSelf(secondArray)); // [0, 0, 0, 0] console.log(productExceptSelf(thirdArray)); // [12, 12, 8, -12] function productExceptSelf(arr){ var result = []; var pro = 1; var len = arr.length; for(var i = 0; i < len; i++){ result.push(pro); pro *= arr[i]; } pro = 1; for(i = len - 1; i >= 0; i--){ result[i] *= pro; pro *= arr[i]; } return result; }數組扁平化
var arr = [1,2,[1,3,[2,[2,3,3],[2,5]]],[6,3]]; //傳統方式 function flat(arr,result=[]){ if(arr.constructor !== Array) return [arr]; var length = arr.length; arr.forEach(function(item){ if(item.constructor !== Array) result.push(item); else result = flat(item, result); }); return result; } var flatted = flat(arr); console.log(flatted); //[1, 2, 1, 3, 2, 2, 3, 3, 2, 5, 6, 3] //優雅方式 var arr=[1,3,4,5,[6,[0,1,5],9],[2,5,[1,5]],[5]]; var flatter = arr => arr.reduce((a, b) => a.concat(Array.isArray(b) ? flatter(b) : b), []); console.log(flatter(arr)); //[1, 2, 1, 3, 2, 2, 3, 3, 2, 5, 6, 3] //另一個方法,簡單但有副作用:把數組內的值全部轉換成了字符串類型 var flatten = a => a.join().split(","); console.log(flatten(arr)); //["1", "2", "1", "3", "2", "2", "3", "3", "2", "5", "6", "3"]查找字符串中出現次數最多的字符及數量
"ababccdeaeajxac".split("").sort().join("").match(/(w)1*/g).reduce(function(a,b){ return a.length > b.length ? a : {char: b[0], length: b.length};}, {char: "", length: 0}); //{char: "a", length: 5}字符串查找
String.prototype.indexOf = String.prototype.indexOf || function(str){ if(str.length > this.length) return -1; var len = 0; var _this = this.split(""), str = str.split(""); var lenA = str.length, this_len = this.length; var temp; for(var i = 0, j = 0; j < lenA; i = 0, j = temp + 1, len = 0){ debugger; while(str[i] !== _this[j] && j < this_len){ j++; } temp = j; while(str[i] === _this[j] && j < this_len){ len++; i++; j++; } if(len === lenA) return temp; } return -1; }字符串查找(KMP 算法)
String.prototype.indexOf = String.prototype.indexOf || function(str){ var next = []; var n = this.length; var m = str.length; calcNext(str,next); for (var i = 0,q = 0; i < n; ++i){ while(q > 0 && str[q] != this[i]) q = next[q-1]; if (str[q] === this[i]){ q++; } if (q === m){ return i - m + 1; } } return -1; function calcNext(str){ var m = str.length; next[0] = 0; for(var q = 1, k = 0; q < m; ++q){ while(k > 0 && str[q] != str[k]) k = next[k-1]; if (str[q] == str[k]){ k++; } next[q] = k; } } }查看鏈表是否有環
function hasCircle(head){ //傳入鏈表頭 var pos1 = head; var pos2 = head; while(pos2){ pos1 = pos1.next; pos2 = pos2.next !== null ? pos2.next.next : null; if(pos1 === pos2) return true; } return false; }求一個數二進制中 1 的個數
function numberOf1(n){ if(n < 0){ n = n >>> 0; } var arr = n.toString(2).split(""); return arr.reduce(function(a,b){ return b === "1" ? a + 1 : a; },0); }翻轉鏈表
/*function ListNode(x){ this.val = x; this.next = null; }*/ function reverseList(pHead){ var newHead, temp; if(!pHead){ return null; } if(pHead.next === null){ return pHead; } else { newHead = ReverseList(pHead.next); } temp = pHead.next; temp.next = pHead; pHead.next = null; temp = null; return newHead; }判斷是否棧序輸出
例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。
function isPopOrder(pushV, popV){ if(!pushV.length || !popV.length){ return false; } var temp = []; var popIndex = 0; var len = pushV.length; for(var i = 0; i < len; i++){ temp.push(pushV[i]); while(temp.length && temp[temp.length - 1] === popV[popIndex]){ temp.pop(); popIndex++; } } return temp.length === 0; }獲取字符串中字符的全排列(無重復)
function permutation(str){ if(!str || str.length === 0){ return []; } var result = []; var arr = str.split(""); var temp = ""; ordering(arr); result = result.filter(function(item, index){ //去重 return result.indexOf(item) === index; }); return result; function ordering(tempArr){ if(tempArr.length === 0){ result.push(temp); return; } for(var i = 0; i < tempArr.length; i++){ temp += tempArr[i]; insideArr = tempArr.concat(); insideArr.splice(i,1); ordering(insideArr); temp = temp.substring(0, temp.length - 1); //回溯 } } }查找有環鏈表的入環節點
/*function ListNode(x){ this.val = x; this.next = null; }*/ function EntryNodeOfLoop(pHead){ if(!pHead){ return null; } var meeting = meetingNode(pHead); if(!meeting){ return null; } var nodeLoop = 1; var node1 = meeting; while(node1.next != meeting){ node1 = node1.next; nodeLoop++; } node1 = pHead; for(var i = 0; i < nodeLoop; i++){ node1 = node1.next; } var node2 = pHead; while(node1 != node2){ node1 = node1.next; node2 = node2.next; } return node1; function meetingNode(node){ if(!node || !node.next){ return null; } var slow = node.next; var fast = slow.next; while(fast && slow){ if(fast === slow){ return fast; } slow = slow.next; fast = fast.next; if(fast){ fast = fast.next; } } return null; } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97631.html
本文包括js學習中簡單功能的算法包括對js以及DOM和BOM的研究過程中一些有意思的代碼實現本文還包括公司面試相關算法問題的代碼段,但不會指出是哪個公司出的題 數據結構及基本排序、查找算法 這個部分內容比較多,請查看一下博客: 基于 Javascript 的排序算法 基于 javascript 的基本數據結構和查找算法 遞歸實現斐波那契數列 function reFib(n){ if (n...
摘要:你需要知道的算法之基礎篇前言很多時候我們都會感慨要是當時了多好啊,現在也不至于這樣難堪了。但是我們不可能又沒必要對每個算法進行測試,只需要知道大概的哪個算法執行所花費的時間多,哪個花費的時間少就行了。 你需要知道的算法之基礎篇 0 - 前言 很多時候我們都會感慨:要是當時×××了多好啊,現在也不至于這樣難堪了。 后悔的時候千千萬,一覺醒來過眼云煙。 我也和蕓蕓眾生一樣在學校的時候沒有好...
摘要:于是翻出了機房里的這本學習數據結構與算法開始學習程序員的基礎知識。這本書用了我最熟悉的來實現各種數據結構和算法,而且書很薄,可以說是一本不錯的入門教程。隊列在頭部刪除元素,尾部添加元素。 本系列所有文章:第一篇文章:學習數據結構與算法之棧與隊列第二篇文章:學習數據結構與算法之鏈表第三篇文章:學習數據結構與算法之集合第四篇文章:學習數據結構與算法之字典和散列表第五篇文章:學習數據結構與算...
閱讀 2977·2023-04-25 17:22
閱讀 1542·2019-08-30 15:54
閱讀 1270·2019-08-30 15:53
閱讀 1787·2019-08-30 15:43
閱讀 3020·2019-08-29 12:29
閱讀 1232·2019-08-26 11:37
閱讀 3255·2019-08-23 18:02
閱讀 1604·2019-08-23 14:15