1. reserve
让数组反转倒置
const arr = [1, 2, 3, 4, 5];
arr.reverse();
console.log(arr); // [5, 4, 3, 2, 1]
const arr = [1, 2, 3, 4, 5];
function reverse(arr) {
let l = 0;
let r = arr.length - 1;
while (l < r) {
let temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
l++;
r--;
}
}
reverse(arr);
console.log(arr); // [5, 4, 3, 2, 1]
let str = 'abcdef';
str = str
.split('') // 拆分成数组
.reverse() // 数组可以倒序
.join(''); // 数组合并成字符串
console.log(str); // fedcba
2. 排序算法
面试最常考:快速排序和希尔算法 (tips)
算法名称 | 时间复杂度 | 空间复杂度 |
---|---|---|
冒泡排序 | O(n2) | O(1) |
选择排序 | O(n2) | O(1) |
快速排序 | O(n*log2n) | O(log2n)~O(n) |
插入排序 | O(n2) | O(1) |
希尔排序 | O | O(1) |
原理:如果是想从小到大排序,拿出数组相邻两位数比较,小的放前,大的放后,如此反复的交换位置就可以得到排序的效果。
function bubbleSort(arr) {
for(let i = 0,l=arr.length;i<l-1;i++) {
for(let j = i+1;j<l;j++) {
if(arr[i]>arr[j]) {
let tem = arr[i];
arr[i] = arr[j];
arr[j] = tem;
}
}
}
return arr;
}
原理:首先从原始数组中找到最小的元素,并把该元素放在数组的最前面,然后再从剩下的元素中寻找最小的元素,放在之前最小元素的后面,知道排序完毕。
function selectSort(arr){
var len=arr.length;
var minIndex,temp;
for(i=0;i<len-1;i++){
minIndex=i;
for(j=i+1;j<len;j++){
if(arr[j]<arr[minIndex]){
minIndex=j;
}
}
temp=arr[i];
arr[i]=arr[minIndex];
arr[minIndex]=temp;
}
return arr;
}
原理:从数组的中间拿一个值,然后通过这个值挨个和数组里面的值进行比较,如果大于的放一边,小于的放一边,然后把这些合并,再进行比较,如此反复即可。
function fastSort(arr){
// 如果只有一位,就没有必要比较
if(arr.length<=1){
return arr;
}
// 获取中间值的索引
var len = Math.floor(arr.length/2);
// 截取中间值
var cur = arr.splice(len,1);
// 小于中间值放这里面
var left = [];
// 大于的放着里面
var right = [];
for(var i=0;i<arr.length;i++){
// 判断是否大于
if(cur>arr[i]){
left.push(arr[i]);
}else{
right.push(arr[i]);
}
}
// 通过递归,上一轮比较好的数组合并,并且再次进行比较。
return sortA(left).concat(cur,sortA(right));
}
原理:想象我们斗地主,摸排阶段,手里的牌都按照从小到大排序。如果每摸一张牌,我们就把他插入合适的位置,使得它比后面位置的牌小,比前面位置的牌大或者相等。
function insert(arr) {
for (var i = 1; i < arr.length; i++) {
var key = arr[i];
var j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
return arr;
}
原理:希尔排序在插入排序的基础上,将数据进行了分组,将原有的数据分为若干个子集,然后对每个子集进行排序,依次类推,不停地分割成子集,直到最后完全排序。
function shellSort(arr) {
var len = arr.length,
temp,
gap = 1;
while(gap < len/3) { //动态定义间隔序列
gap = gap*3+1;
}
for (gap; gap > 0; gap = Math.floor(gap/3)) {
for (var i = gap; i < len; i++) {
temp = arr[i];
for (var j = i-gap; j >= 0 && arr[j] > temp; j -= gap) {
arr[j+gap] = arr[j];
}
arr[j+gap] = temp;
}
}
return arr;
}