剑指offer总结-笔记

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.逆序对问题思路
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值