javaScript

2的次方转换

/*
 * 2的次方运算
 */
for (let i = 0; i < 16; i++) {
  // console.log(1 << i) // 或 2 ** i  //1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
  // console.log(Math.pow(2, i))   //1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
}

/*
 * 根据次方结果, 得出计算次方的次数,即数组的index;index+1则为对象选项的option值
 */
const values = [
  1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
];

const exponents = values.map(v => Math.log2(v));
// → [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
console.log('Math.log for values:', exponents);
console.log('Math.log1:', Math.log2(1)); //0
console.log('Math.log2:', Math.log2(2)); //1

// 生成选项值, num传入值 > =1
const valuesOPT = (num = 1) => {
  if (typeof num !== 'number') {
    return [];
  }

  const resultArr = [];
  for (let i = 0; i < num; i++) {
    resultArr.push(Math.pow(2, i));
  }
  return resultArr;
};

const answerOriginal = valuesOPT(NaN); // [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384] // 选项值
const res = answerOriginal.slice(0, 3);
console.log('answerOriginal:', answerOriginal); // [1]
console.log('res:', res); // [1]

const powers = [
  1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768
];

/**
 * 根据总和来计算是哪些2的次方数相加得到的
 * 例如:1025 = 1 + 1024
 */
const totalSum = 1025;
const result = powers.filter(p => (totalSum & p) === p);
console.log('result:', result); //[1, 1024]

const secondParty = Math.ceil(Math.log2(totalSum) + 1);
console.log('secondParty:', secondParty); // 12
const displayResult = valuesOPT(secondParty).filter(v => (totalSum & v) === v);
console.log('displayResult:', displayResult);

function findSumCombination(arr, target) {
  const nums = arr?.map(_c => +_c) ?? [];
  let dp = new Map();
  dp.set(0, []);

  for (let num of nums) {
    let newDp = new Map(dp);
    for (let [sum, combination] of dp) {
      let newSum = sum + num;
      let newCombination = [...combination, num];
      if (newSum <= target && !newDp.has(newSum)) {
        newDp.set(newSum, newCombination);
      }
    }
    dp = newDp;
  }

  return dp.get(parseFloat(target)) || null;
}

const result2 = findSumCombination(powers, 50176);
console.log('result2:', result2); // [1, 1024]
上次更新: