当前位置: 首页 > article >正文

Leetcode 2939. Maximum Xor Product

  • Leetcode 2939. Maximum Xor Product
    • 1. 解题思路
    • 2. 代码实现
    • 3. 代码优化:
  • 题目链接:2939. Maximum Xor Product

1. 解题思路

这一题思路上来说我们就是逐位进行考虑。

对于xor操作,显然我们只有以下两种情况:

  1. 00或者11:此时我们总可以令两者都变成11,此时获得的乘积一定最大;
  2. 01或者10:此时我们变换的结果也是01或者10,但两者的乘积变化就会有所区别。

因此,这里我们主要需要考虑的就是第二种情况,也就是对于这些位上的01分配问题,而这个不难证明,假设其他位上有结论 a > b a>b a>b,那么总是将1分配到b上面可以使得结果更大。

故而,我们只需要基于这个思路进行代码实现就行了。

2. 代码实现

给出python代码实现如下:

class Solution:
    def maximumXorProduct(self, a: int, b: int, n: int) -> int:
        MOD = 10**9 + 7
        
        def num2digits(num):
            digits = [0 for i in range(50)]
            idx = 0
            while num != 0:
                digits[idx] = num % 2
                num = num // 2
                idx += 1
            return digits
        
        def digits2num(digits):
            flag = 1
            ans = 0
            for d in digits:
                ans += flag * d
                flag = flag * 2 % MOD
            return ans % MOD
        
        def convert(digits_a, digits_b):
            status = 0
            for idx in range(49, -1, -1):
                if idx >= n:
                    if digits_a[idx] > digits_b[idx]:
                        if status == 0:
                            status = 1
                    elif digits_a[idx] < digits_b[idx]:
                        if status == 0:
                            status = 2
                    continue
                if digits_a[idx] == 0 and digits_b[idx] == 0:
                    digits_a[idx] = 1
                    digits_b[idx] = 1
                elif digits_a[idx] == 1 and digits_b[idx] == 1:
                    digits_a[idx] = 1
                    digits_b[idx] = 1
                elif digits_a[idx] == 0 and digits_b[idx] == 1:
                    if status == 0:
                        status = 2
                    elif status == 2:
                        digits_a[idx] = 1
                        digits_b[idx] = 0
                else:
                    if status == 0:
                        status = 1
                    elif status == 1:
                        digits_a[idx] = 0
                        digits_b[idx] = 1
            return
        
        digits_a = num2digits(a)
        digits_b = num2digits(b)
        convert(digits_a, digits_b)
        na = digits2num(digits_a)
        nb = digits2num(digits_b)
        return na * nb % MOD          

提交代码评测得到:耗时69ms,占用内存16.3MB。

3. 代码优化:

看了一下大佬们的提交结果,思路也大差不差,不过实现上就比我优雅很多了,给一个大佬的实现如下,膜拜一下。

class Solution:
    def maximumXorProduct(self, a: int, b: int, n: int) -> int: 
        for i in range(n):
            if (a & (1 << i)) == 0 and (b & (1 << i)) == 0:
                a += 1 << i
                b += 1 << i
        for i in range(n):
            if a > b and (a & (1 << i)) != 0 and (b & (1 << i)) == 0 and (a - (1 << i)) * (b + (1 << i)) > a * b:
                a -= 1 << i
                b += 1 << i
            elif a < b and (a & (1 << i)) == 0 and (b & (1 << i)) != 0 and (a + (1 << i)) * (b - (1 << i)) > a * b:
                a += 1 << i
                b -= 1 << i
        return a * b % int(1e9 + 7)

http://www.kler.cn/news/148004.html

相关文章:

  • 问答知识库快速构建技术解析及行业实践
  • springsecurity6配置三
  • [Java][单列集合+数组遍历方法]通过Lambda表达式简化匿名内部类遍历数组学习体会
  • Python常见基础数据结构
  • 门店管理系统小程序作用是什么
  • 【git】工作中常用的命令
  • linux复习笔记05(小滴课堂)
  • FPGA模块——AD高速转换模块(并行输出转换的数据)
  • SpringBootWeb案例_01
  • RBAC(Role-Based Access Control,基于角色的访问控制)
  • 0040__浅析websocket和http的区别
  • 【解决方案】基于边缘计算技术的安科瑞综合管廊能效管理平台
  • 数据结构-01-数组
  • Node——Node.js简介
  • Python编程进阶:掌握描述符与装饰器的神奇妙用
  • 通过 python 脚本迁移 Redis 数据
  • python 输出日志到文件,删除过期文件
  • Linux 中的 ls 命令使用教程
  • pytdx 分笔 数据
  • 让KVM支持滚动热升级:Multi-KVM
  • 【Qt】之QSet使用
  • 小程序----使用图表显示数据--canvas
  • VMware虚拟机网络配置详解
  • echarts 几千条分钟级别在小时级别图标上展示
  • 【开源】基于Vue和SpringBoot的农家乐订餐系统
  • Python基础:标准库概览
  • 汇编语言指令大全30条
  • 二百零八、Hive——HiveSQL异常:Select查询数据正常,但SQL语句加上group by查询数据为空
  • redis的高可用(主从复制和哨兵模式)
  • 【go入门】表单