算法是程序的灵魂,一个优秀前端工程师对算法也是要有所了解的,本文总结了我们在开发、面试中经常会遇到的基础算法,使用原生JS实现,未必是最优解,可以互相探讨。
为了便于查看,简单分下类,本文也会持续更新。
排序算法
1. 冒泡排序
arr[j+1]){
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
}
2. 快速排序
x)
j--;
if(i
3. 二路归并
PS:将两个按值有序序列合并成一个按值有序序列,则称之为二路归并排序。
字符串操作
1. 判断回文字符串
2. 翻转字符串
2.1 思路1:反向遍历字符串
=0;i--)
tmp += str[i];
return tmp
}
2.2 思路2:转化成array操作。
PS:什么?你要问为啥不直接操作str? 因为str[i]是只读的,不能str[0]=str[1]这样操作。
再PS:如果允许用reverse(),也可以用'str'.split('').reverse().join('')实现。
PS:利用Object中key的唯一性,利用key来进行筛选,然后计数。
= maxValue) {
maxChar = k;
maxValue = charObj[k];
}
}
return maxChar + ':' + maxValue;
}
数组操作
1. 数组去重
PS: 还是利用Object中key的唯一性,利用key来进行筛选。
2. Number数组中最大差值
max)
max = arr[i];
}
return max - min;
}
其他常见算法
1. 阶乘
1.1 非递归实现
1)
result *= num--;
return result;
}
1.2 递归实现
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){
return getfib(n-1) + getfib(n-2);
}
}
function fibo(len){
var fibo = [];
for(var i=0;i
2.2 简约非递归版
3. 二分查找
PS:二分查找又称折半查找,是在有序数组查找中用到的较为频繁的一种算法,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。
3.1 非递归实现
arr[mid]){
low = mid + 1;
}else if(key < arr[mid]){
high = mid -1;
}
}
return -1;
};
3.2 递归实现
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,key);
else if(key < arr[mid])
return binary_search2(arr,mid-1,key);
}