二、字符串
- 回文字符串
//判断回文字符串function palindrome(str) { var reg = /[W_]/g; var str0 = str.toLowerCase().replace(reg, ""); var str1 = str0.split("").reverse().join(""); return str0 === str1;}
- 翻转字符串
function reverseString(str) { return str.split("").reverse().join("");}
- 字符串中出现最多次数的字符
function findMaxDuplicateChar(str) { var cnt = {}, //用来记录所有的字符的出现频次 c = ''; //用来记录最大频次的字符 for (var i = 0; i < str.length; i++) { var ci = str[i]; if (!cnt[ci]) { cnt[ci] = 1; } else { cnt[ci]++; } if (c == '' || cnt[ci] > cnt[c]) { c = ci; } } console.log(cnt) return c;}三、数组
- 数组去重
//数组去重function uniqueArray(arr) { var temp = []; for (var i = 0; i < arr.length; i++) { if (temp.indexOf(arr[i]) == -1) { temp.push(arr[i]); } } return temp; //or return Array.from(new Set(arr));}四、查找
- 二分查找
//二分查找function binary_search(arr, l, r, v) { if (l > r) { return -1; } var m = parseInt((l + r) / 2); if (arr[m] == v) { return m; } else if (arr[m] < v) { return binary_search(arr, m+1, r, v); } else { return binary_search(arr, l, m-1, v); }}
- 将二分查找运用到之前的插入排序中,形成二分插入排序,据说可以提高效率 。但我测试的时候也许是数据量太少,并没有发现太明显的差距 。。大家可以自己试验一下~(譬如在函数调用开始和结束使用console.time('插入排序耗时')和console.timeEnd('插入排序耗时'))
五、树的搜索/遍历
- 深度优先搜索
//深搜 非递归实现function dfs(node) { var nodeList = []; if (node) { var stack = []; stack.push(node); while(stack.length != 0) { var item = stack.pop(); nodeList.push(item); var children = item.children; for (var i = children.length-1; i >= 0; i--) { stack.push(children[i]); } } } return nodeList;}//深搜 递归实现function dfs(node, nodeList) { if (node) { nodeList.push(node); var children = node.children; for (var i = 0; i < children.length; i++) { dfs(children[i], nodeList); } } return nodeList;}
- 广度优先搜索
//广搜 非递归实现function bfs(node) { var nodeList = []; if (node != null) { var queue = []; queue.unshift(node); while (queue.length != 0) { var item = queue.shift(); nodeList.push(item); var children = item.children; for (var i = 0; i < children.length; i++) queue.push(children[i]); } } return nodeList;}//广搜 递归实现var i=0; //自增标识符function bfs(node, nodeList) { if (node) { nodeList.push(node); if (nodeList.length > 1) { bfs(node.nextElementSibling, nodeList); //搜索当前元素的下一个兄弟元素 } node = nodeList[i++]; bfs(node.firstElementChild, nodeList); //该层元素节点遍历完了,去找下一层的节点遍历 } return nodeList;}
-
高阶函数衍生算法
1.filter去重
filter也是一个常用的操作,它用于把Array的某些元素过滤掉,然后返回剩下的元素 。也可以这么理解,filter的回调函数把Array的每个元素都处理一遍,处理结果返回false则过滤结果去除该元素,true则留下来
用filter()这个高阶函数,关键在于正确实现一个“筛选”函数 。
其实这个筛选函数有多个参数,filter(function (element, index, self),演示一个使用filter去重,像这样:
var r, arr = ['Apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry']; r = arr.filter(function (element, index, self) { return self.indexOf(element) === index; //拿到元素,判断他在数组里第一次出现的位置,是不是和当前位置一样,一样的话返回true,不一样说明重复了,返回false 。});2.sort排序算法
排序也是在程序中经常用到的算法 。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小 。如果是数字,我们可以直接比较,但如果是字符串或者两个对象呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来 。通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序 。
值得注意的例子
// 看上去正常的结果:['google', 'Apple', 'Microsoft'].sort(); // ['Apple', 'Google', 'Microsoft'];// apple排在了最后:['Google', 'apple', 'Microsoft'].sort(); // ['Google', 'Microsoft", 'apple']// 无法理解的结果:[10, 20, 1, 2].sort(); // [1, 10, 2, 20]解释原因
推荐阅读
-
-
兵鉴|遭当年开枪海豹队员驳斥,大选关头特朗普自讨没趣!称拉登并没死
-
东方网|100件雕塑来袭 美呆了!滴水湖中国名家主题雕塑园开园
-
游深度■上线获86%好评,一名接线员的自我修养!《911接线员》续作来袭
-
历史皇太后▲漫谈美军''巴祖卡''火箭筒,二战令德军都羡慕不已的反坦克利器
-
宽哥撩育|论金钱教育重要性,给孩子树立正确的金钱观,培养孩子财商要趁早
-
-
周到|倒计时200天!第十届中国花博会吉祥物表情包发布,特许商品上线销售
-
-
爱上历史|当时未成年只判两年缓刑,93岁德国纳粹警卫被判5232项谋杀罪成立
-
为啥坐高铁,很少看到乘务员吃饭,她们不饿吗?列车长说出真相!
-
-
凯迪拉克|长超5米,比途昂好看,标配2.0t+9at,破百8.8秒,喝95号油
-
[黄金]世界上“最孤独”的金矿,黄金遍地却没人敢挖,淘金者:不想找死
-
马来西亚|芯片价格飙涨5倍:马来西亚“封国”加剧全球芯片荒
-
三点论史开火目标警示该国首都!,美不顾士兵生死发动战争!公然入侵敌人
-
-
毛巾降温的正确方法要敷多久 毛巾降温的正确方法要敷多久才好
-
倚天屠龙记|新《倚天屠龙记》已杀青,定妆照很魔幻,勿用“尊重原著”为噱头
-