竞赛-6194. 最小 XOR
解题思路
1、二进制中num的1的数量等于num2中的1的数量
2、num1中二进制,和num前面相同,后面不同,这样异或操作后得到的最小,
3、相同部分不变,不同部分都是0,如果还有1剩余那就都是1
给你两个正整数 num1 和 num2 ,找出满足下述条件的整数 x :
x 的置位数和 num2 相同,且
x XOR num1 的值 最小
注意 XOR 是按位异或运算。
返回整数 x 。题目保证,对于生成的测试用例, x 是 唯一确定 的。
整数的 置位数 是其二进制表示中 1 的数目。
示例 1:
输入:num1 = 3, num2 = 5
输出:3
解释:
num1 和 num2 的二进制表示分别是 0011 和 0101 。
整数 3 的置位数与 num2 相同,且 3 XOR 3 = 0 是最小的。
示例 2:
输入:num1 = 1, num2 = 12
输出:3
解释:
num1 和 num2 的二进制表示分别是 0001 和 1100 。
整数 3 的置位数与 num2 相同,且 3 XOR 1 = 2 是最小的。
提示:
1 <= num1, num2 <= 109
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/minimize-xor
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/** * @param {number} num1 * @param {number} num2 * @return {number} */ var minimizeXor = function(num1, num2) { //没接触过二进制的就难理解了, //1、二进制中num的1的数量等于num2中的1的数量 //2、num1中二进制,和num前面相同,后面不同,这样异或操作后得到的最小, // 相同部分不变,不同部分都是0,如果还有1剩余那就都是1 const str1=num2.toString(2).replace(/0/g,''); const str2=num1.toString(2); let len1=str1.length const len2=str2.length if(len1<len2){ let back; for(let i=0;i<str2.length;i++){ if(str2[i]==='1'){ len1-- } if(len1===0){ back=str2.substr(0,i+1)+'0'.repeat(str2.length-i-1) break }else if(len1>=str2.length-i){ back=str2.substring(0,i)+'1'.repeat(len1) break } } return parseInt(back,2) }else{ return parseInt(str1,2) } };