竞赛-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)
    }
};

 

posted @ 2022-10-03 15:23  无工时代  阅读(73)  评论(0编辑  收藏  举报