前端常见算法JS实现
算法是程序的灵魂,一个优秀的前端工程师对算法也是要有所了解的。
- 排序算法
1. 冒泡排序
- //冒泡排序
- function bubbleSort(arr){
- var i = j = 0;
- for(i=1;i<arr.length;i++){
- for(j=0;j<=arr.length-i;j++){
- var temp = 0;
- if(arr[j]>arr[j+1]){
- temp = arr[j];
- arr[j] = arr[j+1];
- arr[j+1] = temp;
- }
- }
- }
- }
2. 快速排序
- //快速排序
- function quickSort(arr,l,r){
- if(l < r){
- var i = l, j = r, x = arr[i];
- while(i<j){
- while(i<j && arr[j]>x)
- j--;
- if(i<j)
- //这里用i++,被换过来的必然比x小,赋值后直接让i自加,不用再比较,可以提高效率
- arr[i++] = arr[j];
- while(i<j && arr[i]<x)
- i++;
- if(i<j)
- //这里用j--,被换过来的必然比x大,赋值后直接让j自减,不用再比较,可以提高效率
- arr[j--] = arr[i];
- }
- arr[i] = x;
- quickSort(arr, l, i-1);
- quickSort(arr, i+1, r);
- }
- }
3. 二路归并
将两个按值有序序列合并成一个按值有序序列,则称之为二路归并排序
- function merge(left, right) {
- var result = [],
- il = 0,
- ir = 0;
- while (il < left.length && ir < right.length) {
- if (left[il] < right[ir]) {
- result.push(left[il++]);
- } else {
- result.push(right[ir++]);
- }
- }
- while(left[il]){
- result.push(left[il++]);
- }
- while(right[ir]){
- result.push(right[ir++]);
- }
- return result;
- }
字符串操作
1. 判断回文字符串
- 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));
- }
2. 翻转字符串
思路1:反向遍历字符串
- function reverseString(str){
- var tmp = '';
- for(var i=str.length-1;i>=0;i--)
- tmp += str[i];
- return tmp
- }
思路2:转化成array操作
- 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("");
- }
3. 生成指定长度的随机字符串
配合模糊等效果可以生成验证码
- 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;
- }
4. 统计字符串中次数最多的字母
利用Object中key的唯一性,利用key来进行筛选,然后计数
- 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. 数组去重
利用Object中的key的唯一性,利用key来进行筛选
- 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数组中最大差值
- 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. 非递归实现
- 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;
- }
- //2. 递归实现
- 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. 生成斐波那契数列
斐波拉契:又称黄金分割数列,值得是一个数列:0、1、2、3、5、8、13、21、34....,在数学上,斐波拉契数列主要考察递归的调用。
2.1 强行递归实现
- 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 简约非递归实现
- 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. 二分查找
二分查找:是在有序数组中用的比较频繁的一种算法,优点是比较次数少,查找速度快、平均性能好;缺点是要求待查表为有序,且插入删除困难
3.1 非递归实现
- 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 递归实现
- 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实现的更多相关文章
- 前端常见算法的JS实现
1.冒泡排序 function bubbleSort(arr){ var i = 0, j = 0; for(i=1; i<arr.length; i++){ for(j=0; j<=ar ...
- 几种常见算法js
没有系统地总结过js算法,虽然在项目中陆陆续续的也用过好多算法,有一次去一家公司面试的时候,面试官说想谈谈算法,有点懵了,所以接下来的面试中谈的也有点被动,避免下次再碰到这种情况,今天决定好好的总结下 ...
- 常见算法是js实现汇总(转载)
常见算法是js实现汇总 /*去重*/ <script> function delRepeat(arr){ var newArray=new Array(); var len=arr.len ...
- JS中常见算法问题
JS中常见算法问题 1. 阐述JS中的变量提升(声明提前) 答:将所有的变量提升当当前作用域的顶部,赋值留在原地.意味着我们可以在某个变量声明前就使用该变量. 虽然JS会进行变量提升,但并不会执行真正 ...
- 0基础菜鸟学前端之Vue.js
简介:0基础前端菜鸟,啃了将近半月前端VUE框架,对前端知识有了初步的了解.下面总结一下这段时间的学习心得. 文章结构 前端基础 Vue.js简介 Vue.js常用指令 Vue.js组件 Vue.js ...
- 前端怎么用js模拟应用 JSON-通俗易懂
前端怎么用js模拟应用 JSON-通俗易懂,这是转载额 好多孩子 弄不明确复杂的json 格式的应用,以下从基础来看一看JSON.怎么玩, 事实上结构理解清了,写起来比html还爽吧. 0.前言 ...
- 2019前端面试系列——JS面试题
判断 js 类型的方式 1. typeof 可以判断出'string','number','boolean','undefined','symbol' 但判断 typeof(null) 时值为 'ob ...
- 前端与算法 leetcode 7. 整数反转
目录 # 前端与算法 leetcode 7. 整数反转 题目描述 概要 提示 解析 解法 算法 传入测试用例的运行结果 执行结果 GitHub仓库 # 前端与算法 leetcode 7. 整数反转 题 ...
- 前端与算法 leetcode 8. 字符串转换整数 (atoi)
目录 # 前端与算法 leetcode 8. 字符串转换整数 (atoi) 题目描述 概要 提示 解析 解法一:正则 解法二:api 解法二:手搓一个api 算法 传入测试用例的运行结果 执行结果 G ...
随机推荐
- System.Text.Encoding.Default
string strTmp = "abcdefg某某某";int i= System.Text.Encoding.Default.GetBytes(strTmp).Length;/ ...
- zabbix自定义监控mysql
创建用户: use mysql; grant all privileges on *.* to 'zabbix'@'%' identified by 'zabbixpasswd'; grant all ...
- wepy小程序实现列表分页上拉加载(1)
使用wepy开发微信小程序商城第一篇:项目初始化 使用wepy开发微信小程序商城第二篇:路由配置和页面结构 列表页效果图: 1.新建列表页 (1)在pages里面新建一个list.wpy文件 初始代码 ...
- 10.12 android输入系统_InputStage理论
android应用程序对输入系统的处理分为多个阶段,我们把这些阶段称为InputStage 理论处理流程: (1)activity发给window,如果window不能处理,再由activity处理; ...
- 转 OC温故:类的三大特性(封装,继承,多态)
原文标题:OC学习篇之---类的三大特性(封装,继承,多态) 我们都知道,面向对象程序设计中的类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性 ...
- dp hdu5653 xiaoxin and his watermelon candy
传送门:点击打开链接 题意:有n个箱子排成一排,有m个炸弹.位置告诉你.如今炸弹的左边伤害和右边伤害能够自己控制,要求 每一个炸弹炸的箱子数的累乘,输出答案取log2并乘以1e6 思路:直接2for ...
- angular项目中各个文件的作用
原文地址 https://www.jianshu.com/p/176ea79a7101 大纲 1.对angular项目中的一些文件的概述 2.对其中一些文件的详细描述 2.1.package.json ...
- EntityFrameworkCore 中的 Attach 方法
Attach 的坑 Model Filed Database Value Console Value User Phone +123000000000 +12333333333 User Email ...
- 【33.10%】【codeforces 604C】Alternative Thinking
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- [HTML] Creating visual skip links in HTML and CSS
Skip links are an extremely helpful navigation pattern for keyboard and screen reader users, since t ...