题型:选择20 编程2
写在前面:
- 没有解题,只有纯暴力解法...(仅做记录用...
- 具体题目描述懒得打了,可以搜其他帖子
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%
题目提示以下信息:
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