常考算法题解析
位运算
左移<<
console.log(10 << 1);//20
左移就是将二进制全部往左移动一位。10在二进制中表示1010,左移一位后变成10100,转换为十进制也就是20,所以基本可以把左移看成一下公式,a * (2 ^ b)
。
右移>>
console.log(10 >> 1);//5
console.log(13 >> 1);//6
右移就是将二进制全部右移并去除多余的右边。10在二进制中表示为1010,右移一位后变成101,转换为十进制就是5,所以基本可以把右移看成一下公式v = a / (2 ^ b)
。
按位操作
按位与
每一位都为1,结果才为1
console.log(8 & 7);// 1000 & 0111 -> 0000 -> 0
按位或
其中一位为1,结果就是1
console.log(8 | 7);// 1000 | 0111 -> 1111 -> 15
按位异或
每一位都不同,结果才为1
console.log(8 ^ 7);// 1000 ^ 0111 -> 1111 -> 15
console.log(8 ^ 8);// 1000 ^ 1000 -> 0000 -> 0
面试题
两个数不使用四则运算得出和
function sum(a, b) {
if (a == 0) return b
if (b == 0) return a
let newA = a ^ b
let newB = (a & b) << 1
return sum(newA, newB)
}
console.log(sum(1,2));//3
排序
以下两个函数是排序中会用到的通用函数,就不一一写了
function swap(array, left, right) {
let rightValue = array[right]
array[right] = array[left]
array[left] = rightValue
}
swap函数也可以这样写
function swap(array, left, right) {
[array[left], arrar[right]] = [array[right], array[left]];
}
冒泡排序
function bubble(array){
for(let i = array.length - 1;i > 0; i-- ){
for(let j = 0; j < i; j++){
if(array[i] < array[j])swap(array,j,j+1);
}
}
return array;
}
console.log(bubble([2,3,6,1,3,5,2]));