2020-06-22:已知两个非负数的异或值为M,两数之和为N,求这两个数?
福哥答案2020-06-22:
1.遍历法
时间复杂度:O(N)
最好空间复杂度:O(1)
平均空间复杂度:O(sqrt(N))
最坏空间复杂度:O(N)
[0,N/2]依次遍历,符合条件的就是需要的结果。
2.位运算法
最好时间复杂度:O(1)
平均时间复杂度:O(sqrt(N))
最坏时间复杂度:O(N)
最好空间复杂度:O(1)
平均空间复杂度:O(sqrt(N))
最坏空间复杂度:O(N)
1100100 两数和N=100,已知
0010100 异或值M=20,已知
1010000 差N-M=80,如果差为负数或者差为奇数,直接返回空
0101000 差右移1位。
0010100 异或值M=20,已知
0101000 差右移1位。
将上面两个二进制数换成中文如下:
同同异同异同同
零幺零幺零零零
零幺异幺异零零=01x1x00,x代表0和1,只要满足这样的数就行。规则:同零=0,同幺=1,异零=x,异幺=不符合条件。只要出现了异幺,直接返回空。

golang代码如下:
package test23_xorandsum import (
"fmt"
"testing"
) const (
SameOne = 1
SameZero = 0
Different = 2
DifferentZero = 0
) //go test -v -test.run TestXorAndSum
func TestXorAndSum(t *testing.T) {
//M := uint(20)
//N := uint(100) M := uint(1)
N := uint(9)
fmt.Println("M = ", M)
fmt.Println("N = ", N)
fmt.Println("遍历法:", xorAndSum1(M, N))
fmt.Println("位操作法:", xorAndSum2(M, N))
} //M是两个数异或值
//N是两个数之和
//1.遍历法
func xorAndSum1(M uint, N uint) [][]uint {
ret := make([][]uint, 0) //返回多个值
n := N >> 1 //只需要遍历一半 temp := uint(0)
for i := uint(0); i <= n; i++ {
temp = M ^ i
if N-i == temp { //找到异或值和两数和的两个数了
ret = append(ret, []uint{i, temp})
}
} return ret
} //M是两个数异或值
//N是两个数之和
//2.位操作法
func xorAndSum2(M uint, N uint) [][]uint {
ret := make([][]uint, 0) //返回多个值 //两数之和小于两数异或值,不存在这样的情况
if N < M {
return ret
} sub := N - M //差值 //不能被2整除,不存在这样的情况
if sub&1 == 1 {
return ret
} //生成中间结果
sub >>= 1 //差值右移动一位,方便做判断
slicebit := make([]byte, 0)
kind := uint(1)
for sub > 0 || M > 0 {
if M&1 == 1 { //当前位,两数不同
if sub&1 == 1 { //不存在这样的情况
return ret
} else {
slicebit = append(slicebit, Different)
kind <<= 1
}
} else { //当前位,两数相同
if sub&1 == 1 { //当前位肯定都为1
slicebit = append(slicebit, SameOne)
} else { //当前位肯定都为0
slicebit = append(slicebit, SameZero)
}
} sub >>= 1
M >>= 1
} //两数异或值M第1个1位0,作用是去重
for i := len(slicebit) - 1; i >= 0; i-- {
if slicebit[i] == Different {
slicebit[i] = DifferentZero
kind >>= 1
break
}
} //生成结果
retsingle := uint(0)
tempi1 := uint(0)
tempi2 := uint(0)
for i := uint(0); i < kind; i++ { //遍历种类
retsingle = 0
tempi1 = i //这段代码可以省略,影响打印顺序
//00=0 01=1 10=2 11=3
//00=0 10=2 01=1 11=3
kindtemp := kind
tempi2 = 0
for {
tempi2 <<= 1
tempi2 |= tempi1 & 1
tempi1 >>= 1 kindtemp >>= 1
if kindtemp <= 1 {
break
}
}
tempi1 = tempi2 //生成结果
for j := len(slicebit) - 1; j >= 0; j-- {
retsingle <<= 1
if slicebit[j] <= SameOne {
retsingle |= uint(slicebit[j])
} else {
retsingle |= uint(tempi1 & 1)
tempi1 >>= 1
}
} //将结果保存起来
ret = append(ret, []uint{retsingle, N - retsingle})
} return ret
}
敲命令go test -v -test.run TestXorAndSum,执行结果如下:

2020-06-22:已知两个非负数的异或值为M,两数之和为N,求这两个数?的更多相关文章
- 已知从BUF开始存放了10个字类型有符号数据,编程求出这10个数中的最大数和最小数(将最大数存入MAX字单元、最小数存入MIN字单元),并将其以10进制数的形式在屏幕上显示出来。
data segment pmax db 0dh,0ah , 'MAX : ','$' pmin db 0dh,0ah , 'MIN : ','$' buf ...
- 【LeetCode】三数之和【排序,固定一个数,然后双指针寻找另外两个数】
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...
- C# 序列化过程中的已知类型(Known Type)
WCF下的序列化与反序列化解决的是数据在两种状态之间的相互转化:托管类型对象和XML.由于类型定义了对象的数据结构,所以无论对于序列化还是反序列化,都必须事先确定对象的类型.如果被序列化对象或者被反序 ...
- WCF技术剖析之十三:序列化过程中的已知类型(Known Type)
原文:WCF技术剖析之十三:序列化过程中的已知类型(Known Type) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话) ...
- Luogu-P1027 Car的旅行路线 已知三点确定矩形 + 最短路
传送门:https://www.luogu.org/problemnew/show/P1027 题意: 图中有n个城市,每个城市有4个机场在矩形的四个顶点上.一个城市间的机场可以通过高铁通达,不同城市 ...
- 653. 两数之和 IV - 输入 BST + HashSet
653. 两数之和 IV - 输入 BST 题目描述 题解分析 最简单的方法就是遍历整棵树,找出所有可能的组合,判断是否存在和为 kk 的一对节点.现在在此基础上做一些改进. 如果存在两个元素之和为 ...
- 两数之和,两数相加(leetcode)
我们都知道算法是程序员成长重要的一环,怎么才能提高算法呢, 出来在网上看视频之外,动手练习是非常重要的.leetcode 就是一个非常好的锻炼平台. 1. 两数之和,在 leetcode 里面是属于 ...
- LeetCode | No.1 两数之和
题目描述: Given an array of integers, return indices of the two numbers such that they add up to a speci ...
- Java集合-5. (List)已知有一个Worker 类如下: 完成下面的要求 1) 创建一个List,在List 中增加三个工人,基本信息如下: 姓名 年龄 工资 zhang3 18 3000 li4 25 3500 wang5 22 3200 2) 在li4 之前插入一个工人,信息为:姓名:zhao6,年龄:24,工资3300 3) 删除wang5 的信息 4) 利用for 循
第六题 5. (List)已知有一个Worker 类如下: public class Worker { private int age; private String name; private do ...
随机推荐
- android studio 正式版打包错误的一个问题
今日在下载了别人的demo后,编译到我的手机上,然后通过qq等把软件发到其他的手机上使用时,无法安装,好像是因为这个是调试版本才安装不上,在网搜了一堆资料怎么建key怎么发布正式的版本,问题现在已解决 ...
- Linux系统中(CentOS 7)的用户和权限管理
目录 用户和组 用户信息文件 用户密码信息 相关命令 用户管理 组管理 密码管理 权限管理 文件的详细信息 文件权限 相关命令 用户和组 用户信息文件 /etc/passwd (1 2 3 4 5 6 ...
- Django安装与简单配置(1)
目录 1. 环境准备 2. 开始安装 2.1 安装Django 2.2 安装 Mysql数据库 3. 开始配置 3.1 Django简单配置 3.1.1 创建一个工程(project)为devops: ...
- 痞子衡嵌入式:16MB以上NOR Flash使用不当可能会造成软复位后i.MXRT无法正常启动
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是i.MXRT上使用16MB以上NOR Flash软复位无法正常启动问题的分析解决经验. 痞子衡这几天在支持一个i.MXRT1050客户项 ...
- HTML学习汇总
HTML学习大汇总 (1)HTML概述 Html(超文本标记语言): 用文字来描述的标签语言,用文字来描述网页的一种语言. HTML是 HyperText Mark-up Language 的首字母简 ...
- 一步步教你用Prometheus搭建实时监控系统系列(二)——详细分析拉取和推送两种不同模式
前言 本系列着重介绍Prometheus以及如何用它和其周边的生态来搭建一套属于自己的实时监控告警平台. 本系列受众对象为初次接触Prometheus的用户,大神勿喷,偏重于操作和实战,但是重要的概念 ...
- 远光武汉研发中心区块链事业部Java面试总结
面试在约定的时间准时进行,也是采用腾讯会议远程面试的方式.但是这是我第一次遇到面试官未打开摄像头的情况,后面经过沟通,双方都打开摄像头进行交流. 之前了解这个岗位主要是区块链相关的Java开发,所以事 ...
- Vue + Element 实现多选框选项上限提示与限定
上图先,看效果!!! //vue文件夹内<el-form :model="form" class="form-inline"> <!-- :s ...
- 部分浏览器 set-cookie 不成功踩坑记录
事件起因: 公司正在做一个sso的单点登录的项目,做完之后,在测试阶段,不同的终端的兼容测试时候,好几个不同的浏览器出现了不同的问题,有登录之后自动退出,有登陆不成功等问题. 在 pc 端只有 uc ...
- Python os.pathconf() 方法
概述 os.pathconf() 方法用于返回一个打开的文件的系统配置信息.高佣联盟 www.cgewang.com Unix 平台下可用. 语法 fpathconf()方法语法格式如下: os.fp ...