IQ知识

iq record…

贪心算法

collection

  1. R:64 个运动员, 8 个跑道, 如果要选出前四名, 至少跑几次?
    Q: 最少 10 次,最多 11 次

  2. 数组比较时,内部调用的是数组的 toString 方法, 而 数组的 toString 又是调用数组的 join 方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var a = [1, 2, 3];
a.join = a.shift;
if (a == 1 && a == 2 && a == 3) {
console.log(1);
}

Object.defineProperty(window, "a", {
get: function () {
return (this.value = this.value ? (this.value += 1) : 1);
},
});
if (a == 1 && a == 2 && a == 3) {
console.log(1);
}

var a = {
n: 1,
valueOf() {
return this.n++;
},
};
if (a == 1 && a == 2 && a == 3) {
console.log(1);
}
  1. 实现 sum 函数,参数为数组,求该数组所有项之和,不允许使用循环和数组方法
    遍历一个数组中的所有子项,能用到的方法只有循环和递归。
    基于这个函数,我们还可以推演出一个递推公式:_sum(i) = arr[i] + _sum(i + 1)
    边缘情况,当参数 i 大于等于数组的 length 之后,就无法求和了,所以这时返回 0
1
2
3
4
5
6
7
function sum(arr) {
function _sum(i) {
if (i >= arr.length) return 0;
return arr[i] + _sum(++i);
}
return _sum(0);
}
  1. 2 的 n 次方写法,1>>n

  2. />>>无符号右移
    数组通过 indexOf()和 splice()做查找删除时, 若 indexOf()没有找到值则会返回-1,而 splice()传-1 则会将数组最后一个值删除,引发 bug,故利用>>>0 将-1 转成一个大数,splice()就不会错误删除了。

  3. 位运算

<< 相当于 left * (2 ^ right) 并向下取整
/>> 相当于 left / (2 ^ right) 并向下取整

1
2
3
4
// 奇数则为1
1 & 1 => 1
// 偶数则为0
2 & 1 => 0

按位取反(~): 一元运算, 1 变0,0变1

>>> 又叫无符号右移。左边高位补零,看绿色标记

1
~123; //-124
  1. 数组 nums 中的元素映射成二进制数 mask,取出对应的元素集合
1
2
3
4
5
6
let result = []
for(let i=0; i<nums.length; i++) {
if(mask&(1<<i)){
result.push(nums[i])
}
}
  1. 原码、反码和补码

三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。
0正1负

正整数的补码是其二进制表示,与原码相同

负整数的补码,将其原码除符号位外的所有位取反(0变1,1变0,符号位为1不变)后加1

0的补码反码原码唯一,都是00000000
9. 0.3 - 0.2
因为计算机使用64位存储小数时,第1位为符号位,接着11位位指数位,后面52位为小数位,0.1和0.2在转换为小数时都存在无限循环现象,循环数都为”1100“。因此在最后一位会有0舍1入的现象,所以0.3-0.2!=0.1。因为两者的循环数相同,抵消后所以0.2-0.1=0.1。

  1. 栈区存的是基本数据类型的变量名和值,而引用数据类型存放在栈区的是变量名和引用地址,它的值放在堆中

  2. js八大基本数据类型
    Number String Boolean Null Undefined Object Symbol BigInt

  3. <<和>>,,,左移右移进位补零

  4. sort改变原数组