js-常见算法操作
字符串操作
判断回文字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
function palindrome(str){ // \W匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。 var re = /[\W_]/g; // 将字符串变成小写字符,并干掉除字母数字外的字符 var lowRegStr = str.toLowerCase().replace(re, '' ); // 如果字符串lowRegStr的length长度为0时,字符串即是palindrome if (lowRegStr.length===0) return true ; // 如果字符串的第一个和最后一个字符不相同,那么字符串就不是palindrome if (lowRegStr[0]!=lowRegStr[lowRegStr.length-1]) return false ; //递归 return palindrome(lowRegStr.slice(1,lowRegStr.length-1)); } |
翻转字符串
思路1:反向遍历字符串
1
2
3
4
5
6
|
function reverseString(str){ var tmp = '' ; for ( var i=str.length-1;i>=0;i--) tmp += str[i]; return tmp } |
思路2:转化成array操作。
1
2
3
4
5
6
7
8
9
10
11
12
|
function reverseString2(str){ var arr = str.split( "" ); var i = 0,j = arr.length-1; while (i<j){ tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp; i++; j--; } return arr.join( "" ); } |
PS:什么?你要问为啥不直接操作str? 因为str[i]是只读的,不能str[0]=str[1]这样操作。
再PS:如果允许用reverse(),也可以用'str'.split('').reverse().join('')实现。
生成指定长度随机字符串
PS:配合模糊等效果可以生成个验证码- -
1
2
3
4
5
6
7
|
function randomString(n){ var str = 'abcdefghijklmnopqrstuvwxyz0123456789' ; var tmp = '' ; for ( var i=0;i<n;i++) tmp += str.charAt(Math.round(Math.random()*str.length)); return tmp; } |
统计字符串中次数最多字母
PS:利用Object中key的唯一性,利用key来进行筛选,然后计数。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
function findMaxDuplicateChar(str) { if (str.length == 1) { return str; } var charObj = {}; for ( var i = 0; i < str.length; i++) { if (!charObj[str.charAt(i)]) { charObj[str.charAt(i)] = 1; } else { charObj[str.charAt(i)] += 1; } } var maxChar = '' , maxValue = 1; for ( var k in charObj) { if (charObj[k] >= maxValue) { maxChar = k; maxValue = charObj[k]; } } return maxChar + ':' + maxValue; } |
数组操作
1. 数组去重
PS: 还是利用Object中key的唯一性,利用key来进行筛选。
1
2
3
4
5
6
7
8
9
10
11
|
function unique(arr){ var obj = {} var data = [] for ( var i in arr){ if (!obj[arr[i]]){ obj[arr[i]] = true ; data.push(arr[i]); } } return data; } |
2. Number数组中最大差值
1
2
3
4
5
6
7
8
9
10
|
function getMaxProfit(arr){ var min = arr[0], max = arr[0]; for ( var i=0;i<arr.length;i++){ if (arr[i]<min) min = arr[i]; if (arr[i]>max) max = arr[i]; } return max - min; } |
其他常见算法
1. 阶乘
1.1 非递归实现
1
2
3
4
5
6
7
8
|
function factorialize(num) { var result = 1; if (num < 0) return -1; if (num == 0 || num == 1) return 1; while (num>1) result *= num--; return result; } |
1.2 递归实现
1
2
3
4
5
6
7
8
|
function factorialize(num) { var result = 1; if (num < 0) return -1; if (num == 0 || num == 1) return 1; if (num > 1){ return num*factorialize(num-1); } } |
2. 生成菲波那切数列
PS:斐波那契数列,又称黄金分割数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列主要考察递归的调用。通过定义fibo[i] = fibo[i-1]+fibo[i-2];来生成斐波那契数组。
2.1 强行递归实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
function getfib(n){ if (n == 0) return 0; if (n == 1) return 1; if (n > 1){ return getfib(n-1) + getfib(n-2); } } function fibo(len){ var fibo = []; for ( var i=0;i<len;i++) fibo.push(getfib(i)); return fibo; } |
2.2 简约非递归版
1
2
3
4
5
6
7
8
9
10
11
12
13
|
function getFibonacci(n) { var fibarr = []; var i = 0; while (i < n) { if (i <= 1) { fibarr.push(i); } else { fibarr.push(fibarr[i - 1] + fibarr[i - 2]) } i++; } return fibarr; } |
3. 二分查找
PS:二分查找又称折半查找,是在有序数组查找中用到的较为频繁的一种算法,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。
3.1 非递归实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
function binary_search(arr, key) { var low = 0, high = arr.length - 1; while (low <= high){ var mid = parseInt((high + low) / 2); if (key == arr[mid]){ return mid; } else if (key > arr[mid]){ low = mid + 1; } else if (key < arr[mid]){ high = mid -1; } } return -1; }; |
3.2 递归实现
1
2
3
4
5
6
7
8
9
10
11
|
function binary_search2(arr, low, high, key) { if (low > high) return -1; var mid = parseInt((low + high)/2); if (key == arr[mid]) return mid; else if (key > arr[mid]) return binary_search2(arr, mid+1, high, key); else if (key < arr[mid]) return binary_search2(arr, low, mid-1, key); } |
js-常见算法操作的更多相关文章
- touch.js——常见应用操作
touch.js--常见应用操作 基本事件: touchstart //手指刚接触屏幕时触发 touchmove //手指在屏幕上移动时触发 touchend //手指从屏幕上移开时 ...
- Js常见算法实现汇总
/*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.length; for(var ...
- js常见算法
1:实现一个函数clone,可以对JavaScript中的5种主要的数据类型(包括Number.String.Object.Array.Boolean)进行值复制. function clone(Ob ...
- JS常见算法题目
最近收集了几个经典JS题目,比较有代表性,分享一下: 1.xiaoshuo-ss-sfff-fe 变为驼峰xiaoshuoSsSfffFe function getCamelCase(str ...
- js常见算法(一)
1.每个单词手字母大写 var capitalizeEveryWord = str => str.replace(/\b[a-z]/g, char => char.toUpperCase( ...
- 常见算法是js实现汇总(转载)
常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.len ...
- 前端常见算法的JS实现
1.冒泡排序 function bubbleSort(arr){ var i = 0, j = 0; for(i=1; i<arr.length; i++){ for(j=0; j<=ar ...
- JS中常见算法问题
JS中常见算法问题 1. 阐述JS中的变量提升(声明提前) 答:将所有的变量提升当当前作用域的顶部,赋值留在原地.意味着我们可以在某个变量声明前就使用该变量. 虽然JS会进行变量提升,但并不会执行真正 ...
- 前端常见算法JS实现
算法是程序的灵魂,一个优秀的前端工程师对算法也是要有所了解的. 排序算法 1. 冒泡排序 //冒泡排序 function bubbleSort(arr){ var i = j = 0; for(i=1 ...
- Hadoop学习笔记—12.MapReduce中的常见算法
一.MapReduce中有哪些常见算法 (1)经典之王:单词计数 这个是MapReduce的经典案例,经典的不能再经典了! (2)数据去重 "数据去重"主要是为了掌握和利用并行化思 ...
随机推荐
- JavaScript--关于闭包(closure)
js代码在执行前会做的几件事情: 1.代码检测 2.预编译:在执行代码之前会对代码中的函数以及变量提前声明 并且做一些其他的处理 1.函数在执行前的一瞬间,会生成一个OA(object action) ...
- 3.Java集合-HashSet实现原理及源码分析
一.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持,它不保证set的迭代顺序很久不变.此类允许使用null元素 二.HashSet的实现: 对于Ha ...
- 安卓直连SQLSEVER数据库
1.导入连接SQLSEVER的jar包:可以支持android的SQL驱动(如:jtds-1.2.7.jar) 2.编写连接数据库的工具类 import java.lang.reflect.Field ...
- Windows10系统里安装SCons
1. 安装python2.7 执行python2.x的安装包程序python-2.7.12.amd64.msi进行安装即可 2. 安装scons 下载scons-2.5.0.zip压缩包并解压缩 CM ...
- init system
参考:5 Best Modern Linux ‘init’ Systems (1992-2015) 参考:Linux开机流程 参考:<鸟哥的 Linux 私房菜:基础学习篇 第四版>第十七 ...
- rsync备份案例
客户端需求 1.客户端提前准备存放的备份的目录,目录规则如下:/backup/nfs_172.16.1.31_2018-09-02 2.客户端在本地打包备份(系统配置文件.应用配置等)拷贝至/back ...
- Reverse数组以及大O表达式
这篇主要是对数组实现一个倒排序(比如数组1.2.3,最后输出3.2.1),当然实现这个功能是非常easy的事,但是这里需要引入另外一个很重要的概念-----如何计算一个算法的时间复杂度并学会用大O表达 ...
- TCP的服务简单介绍
1 引言尽管T C P和U D P都使用相同的网络层(I P),T C P却向应用层提供与U D P完全不同的服务.T C P提供一种面向连接的.可靠的字节流服务.面向连接意味着两个使用 T C P的 ...
- ubunu安装qq、微信等、
参考: https://www.lulinux.com/archives/1319 安装下面下载deepin-wine-for-ubuntu,然后进去安装 https://github.com/wsz ...
- 从list引用调用arraylist和linkedlist对象的方法了解多态
一.前言 今天和朋友在写代码时突然发现List<object> list=new ArrayList<object>()中,前面是通过List引用来调用其子类ArrayLis ...