二、字符串
- 回文字符串
//判断回文字符串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]解释原因
推荐阅读
-
火爆新闻|秦岚面临的中年困境,这剧都说透了,“谁愿看老女人跟鲜肉恋爱”
-
周到|进博会倒计时30天| 进博会指定住宿场所疫情防控工作指引已出炉,“护航进博” 联合执法进行中
-
15跌!猪价下跌无止境|15跌!猪价下跌无止境 肉价不降反涨?平价猪肉在哪里?
-
『美国』最新民调结果出炉,美国下届总统“已成定局”,拜登无缘总统之位!
-
『太极本草』两栖蓼,见过吗?清热利湿,能治痢疾、脚浮肿、疔疮
-
A股|IPO大跃进:新股发行太快,沪深两市主板注册制还有空间吗?
-
-
-
融合|财政部回应PPP与专项债融合:防控风险前提下允许地方探索
-
-
-
飞机|美国飞行比赛出意外:一飞机瞬间烧成巨大火球坠毁 现场画面公布
-
-
-
辣妹盘点酱|5.10已为基于EFI引导的RISC-V硬件提供了初步支持,Linux
-
「男性」约会时香水起到什么作用?该如何正确使用呢?
-
娱星扒姐 贾玲在北京开面馆,食客吃了一碗"猪蹄面",付款时:不会再来
-
壹方侃天下|穿阔腿裤身材圆润,太接地气,那英罕见同框家人
-
仙尊科技才是企业最快的获客方式,未来5-10年!裂变式营销
-
小倩侃八卦▲摆方阵,召唤勇士,大招非常厉害,王者荣耀:新英雄蒙恬正式上线