算法题
题目描述
- 将数字各个数位上的数字的乘方相加
- 如果结果是1,则该数字和快乐数
- 否则不是
解法一
老规矩:自己写的
/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function (n) {
let res = n;
let count = 0; // 假设有结果,则100次以内必定会出现结果
while (res !== 1 && count < 99) {
res = getSplitResult(res);
count++;
}
return res === 1;
};
/**
* @param {number} n
* @return {number}
*/
function getSplitResult(n) {
if (typeof n !== "number") return;
const res = (n + "").split("");
const count = res.reduce((pre, current) => {
return pre + current * current;
}, 0);
return count;
}
解题思路:
- 写一个函数,用于返回各个数位的乘方和
- 假设一个快乐数100次以内一定可以判断出(我自己想的)
- 如果循环次数 < 100 并且 当前结果不是 1,则一直循环
- 如果当前数等于1或者循环次数到100次,返回当前数是否等于1
解法二
function getSplitResult(n) {
if (n == 1 || n == 0) return n;
let res = 0;
while (n) {
res += (n % 10) * (n % 10);
n = parseInt(n / 10);
}
return res;
}
var isHappy = function (n) {
const sumSet = new Set();
// 如果sumSet中有,则说明该数的结果 !== 1,直接返回结果
while (n != 1 && !sumSet.has(n)) {
// 如果 sumSet中没有,将当前数替换为计算结果,并记录到 sumSet中
sumSet.add(n);
n = getSplitResult(n);
}
return n == 1;
};
解题思路
- 写一个函数,用于返回各个数位的乘方和
- 声明一个hash表,记录当前的数据是否计算过,如果计算过,返回计算结果,如果未计算过,计算并保存计算记录
- 当所有数据都计算过时,停止循环,并判断结果是否等于1
面试题
JS 中的数据类型有哪些
- 基础类型
- 复杂类型
基础类型
- number
- string
- boolean
- undefined
- null
- symbol
- bigInt
复杂类型
所有的复杂类型本质都是 Object
两个数据的区别
区分
内存地址上看
基础类型存放在栈内存中,栈存放的数据,读取灵活,操作快,长度固定、生命周期短
复杂类型存放在堆内存中,使用灵活,可以嵌套属性,生命周期长
访问方式
基础类型在栈中保存的就是本身的值,只有一次存取周期
复杂类型保存的是内存中的地址,本身是一个地址值,最少有两次存取周期
比较方式
基础类型的比较是内容比较,两个值的内存地址不一样,但是内容一样,则是一样的
复杂类型比较是内存中的地址值,即两个元素内存地址一样,则相等,如果内容一样,但是内存地址不一样,则不一样
添加属性
基础类型因为本身只存放内容,所以不存在属性的说法,无法为基础类型的值添加属性
复杂类型的值本身是内存地址,是对象,所以存在属性的概念可以动态的分配属性
变量赋值
基础类型如果使用等号进行赋值时,是重新声明一个栈内存,并将当前的值复制一份到新的内存中
复杂类型赋值时赋值的是内存地址,即重新声明一块堆内存地址,并将复制对象的地址保存到新声明的内存中