滴滴前端笔试9.17
题型:选择20 编程2
写在前面:
- 没有解题,只有纯暴力解法...(仅做记录用...
- 具体题目描述懒得打了,可以搜其他帖子
编程1:二进制加密(73%)
let y = parseInt(read_line()); // 表示处理后的数 function fn1(n) { let res = []; const len = [...n.toString(2)].length; for (let i = 1; i < len; i++) { // i表示二进制中1的个数 if (n % i === 0) { let temp = n / i; if (helper(temp) === i) { res.push(temp); } } } res.sort((a, b) => a-b); return { len: res.length, res: res, } } // 这个函数就是在计算y(x) function helper(num) { // 获取二进制个数 let ret = 0; for (let i = 0; i < 32; i++) { if ((num & (1 << i)) !== 0) { ret++; } } return ret; } const {len, res} = fn1(y); console.log(len); console.log(res.join(' ')); // 73%
编程2: 实验数据(45%)
题目提示以下信息:
- 这个数是正整数,且没有前导零(即数的最高位不是0)
- 这个数任意两个相邻数位的数字不同
- 这个数可以被3整除
const str = read_line(); // 包含?的数字 console.log(fn2(str)); function fn2(str) { const arr = [...str]; // 思路先构造,再去调整可以被3整除 /* 三个地方处理: 1. 两个特殊位置:索引为0和str.length-1处 2. 中间位置 中间位置最复杂: 1) 1 ? 2 ===> 1 0 2 2) 0 ? 1 || 1 ? 0 3) 0 ? 2 || 2 ? 0 || 0 ? ? 4) 0 ? 0 ===> 0 1 0 */ for (let i = 0; i < arr.length; i++) { if (arr[i] === '?') { if (i === 0) { arr[i] = arr[i + 1] === '1' ? '2' : '1'; } else if (i === arr.length - 1) { arr[i] = arr[i - 1] === '0' ? '1' : '0'; } else { // 复杂情况 // console.log(arr[i - 1], arr[i + 1]) if (arr[i - 1] !== '0' && arr[i + 1] !== '0') { arr[i] = '0'; } else if (arr[i - 1] === '0' && arr[i + 1] === '0') { arr[i] = '1'; } else if (arr[i - 1] === '0' && arr[i + 1] !== '0') { if (arr[i + 1] === '1') { arr[i] = '2' } else { arr[i] = '1' } } else if (arr[i - 1] !== '0' && arr[i + 1] === '0') { if (arr[i - 1] === '1') { arr[i] = '2' } else { arr[i] = '1'; } } } } else { continue; } } // arr.map(item => parseInt(item)); // let sum = arr.reduce((p, v) => p+v); let res = Number(arr.join('')); // console.log(res) if (res % 3 === 0) { return res; } else { let remainer = 3 - res % 3; return res + remainer; } } // 45#滴滴##前端#