1.unshift()
push():在数组末尾添加元素
pop:删除数组末尾第一个元素,并返回这个元素
unshift:在数组开头添加元素
shift:删除数组开头的第一个元素,并返回这个元素
2.slice()
arrayObject.slice(start,end)
返回从start到end(不包括end)的元素
3.动态规划
递归效率不高
动态规划效率较高
(1)数组版动态规划
function dynFib(n) {
let val = [];
for(let i = 0; i <= n; ++i){
val[i]=0;
}
if(n ===1 || n === 2){
return 1;
}
else {
val[1] =1;
val[2] = 2;
for(let i = 3; i <= n; ++i){
val[i] = val [i-1] +val[i-2] ;
}
}
return val[n-1]
}
(2)迭代版动态规划
function iterFib(n) {
let last = 1;
let nextLast = 1;
let result = 1;
for (let i = 2; i < n; ++i) {
result = last + nextLast;
nextLast = last;
last = result;
}
return result;
}
3.原码,反码,补码
原码:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
反码:
正数:反码=原码
负数:反码=原码保留符号位,其他位全部取反
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
补码:
正数:补码=原码
负数:补码=反码+1
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
4.左移,有符号右移,无符号右移
左移:<<
var old = 2;
var new = old << 5;
old:10
new:1000000
有符号右移:>>(保留符号位,以符号位来填充空位)
var old = 64;
var new = old >> 5;
无符号右移:>>>(32位都右移)
正数:无符号右移和有符号右移一样
负数:(1)无符号右移是用0填充空位(有符号右移是用符号位填充空位)
(2)负数的二进制当成正数的二进制
负数是以补码的形式存储
var old = -64;
var new = old >>> 5;
64的原码 :00000000 00000000 00000000 01000000
-64的原码:10000000 00000000 00000000 01000000
-64的反码:11111111 11111111 11111111 10111111
-64的补码:11111111 11111111 11111111 11000000
无符号右移将-64的二进制码(补码)当成是正数的二进制码,即4294967232
将-64的补码右移5位
00000111 11111111 11111111 11111110
化成十进制:134217726
5.NumberObject.toString(radix)
例如,当 radix 为 2 时,NumberObject 会被转换为二进制值表示的字符串。
6.while(-3)表示真
while中非0数都表示真,负数也表示真
只有0为假
7.树的深度遍历和广度遍历
一般来说树的广度遍历用队列,利用先进先出的特点来保存之前节点,并操作之前的节点。
树的深度遍历一般来说用栈或者递归,利用先进后出的特点来保存之前节点,把之前的节点留到后面操作。
8.二叉搜索树
二叉查找树(Binary Search Tree),(又:二叉搜索树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
var n = 3;
while(- -n){
console.log(n);
}
输出:2 1
var n = 3;
while(n- -){
console.log(n);
}
输出:2 1 0
10.Array.of()
创建一个具有可变数量参数的新数组实例
与Array()有区别
Array.of(7); // [7]
Array.of(1, 2, 3); // [1, 2, 3]
Array(7); // [ , , , , , , ]
Array(1, 2, 3); // [1, 2, 3]
11.new Map()
Javascript的Object本身就是键值对的数据结构,但实际上属性和值构成的是”字符串-值“对,属性只能是字符串,如果传个对象字面量作为属性名,那么会默认把对象转换成字符串,结果这个属性名就变成”[object Object]“。
ES6提供了”值-值“对的数据结构,键名不仅可以是字符串,也可以是对象。它是一个更完善的Hash结构。
const map1 = new Map()
const objkey = {p1: ‘v1’}
map1.set(objkey, ‘hello’)
console.log(map1.get(objkey))
键值对,键值可以是对象
-
~ ~ false === 0
- ~true === 1
- ~undefined === 0
- ~!undefined === 1
- ~null === 0
- ~!null === 1
- ~"" === 0
-
~!"" === 1
是按位取反的意思,计算机里面处理二进制数据时候的非,~就是再转回来,利用两个按位取反的符号,进行类型的转换,转换成数字符号。
13.1到n整数中1出现的次数
14.加法运算符优先级高于位运算符
mid = left + right >> 1
先算加,再位移
15.平衡二叉树
空树或者左右子树高度差不超过1
0-9的ascii值的后四位就是二进制0-9的表示,所以char[i]-‘0’ = char[i]& oxf(1111)
17.逆序对问题思路