最近star了一个Git项目,项目主要是收集各厂的面试题,有很多有意思的题目,每天看一题,记个笔记。
传送门:https://github.com/Advanced-Frontend/Daily-Interview-Question
这道面试题的几个解法如下:
1.最简单的方法:先转换成对应倍数的进制,后面补0后再转回10进制
let getRes = (num, multiple) => {
let res = [num.toString(multiple), '0'].join('')
return parseInt(res, 7)
}
getRes(12, 7) // 84
2.位运算(相关细节参考:https://blog.csdn.net/sinat_35121480/article/details/53510793)
核心思想:
1、m 和 n 是两个二进制整数,求 m + n:
2、用与运算求 m 和 n 共同为 “1” 的位: m’ = m & n
3、用异或运算求 m 和 n 其中一个为 “1” 的位: n’ = m ^ n
4、如果 m’ 不为 0,那么将 m’ 左移一位(进位),记 m = m’ << 1,记 n = n’,跳回到步骤 1
5、如果 m’ 为 0,那么 n’ 就是我们要求的结果
<<: 左移运算
将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。
例:a = a<< 2将a的二进制位左移2位,右补0,
左移1位后a = a *2;
若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
^: 异或运算
参加运算的两个数据,按二进制位进行“异或”运算。
运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0;
即:参加运算的两个对象,如果两个相应位为“异”(值不同),则该位结果为1,否则为0。
&: 按位与运算
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0
/* 获取和 */
let add = (sum, num) => {
while(sum) {
[sum, num] = [(sum & num) << 1, sum ^ num]
}
return num
}
/* 求和 */
let getRes = (num, mul) => {
let sum = 0
let arr = new Array(mul)
while(arr.length) {
sum = add(sum, num)
arr.shift()
}
return sum
}
3.黑科技
(1).String.fromCharCode方法,将对应的uniCode转换成对应的字符串
eval方法,计算某个字符串,执行字符串中的js代码
*号对应的uniCode为42
let getRes = (num, mul) => eval([num, String.fromCharCode(42), mul].join(''))
(2).new Function:实例化一个Function对象来执行参数中的JS
let getRes = (num, mul) => {
let _fn = new Function("return " + num + String.fromCharCode(42) + mul)
return _fn()
}