福哥答案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,求这两个数?的更多相关文章

  1. 已知从BUF开始存放了10个字类型有符号数据,编程求出这10个数中的最大数和最小数(将最大数存入MAX字单元、最小数存入MIN字单元),并将其以10进制数的形式在屏幕上显示出来。

    data segment            pmax db 0dh,0ah , 'MAX :   ','$'    pmin db 0dh,0ah , 'MIN :   ','$'    buf ...

  2. 【LeetCode】三数之和【排序,固定一个数,然后双指针寻找另外两个数】

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...

  3. C# 序列化过程中的已知类型(Known Type)

    WCF下的序列化与反序列化解决的是数据在两种状态之间的相互转化:托管类型对象和XML.由于类型定义了对象的数据结构,所以无论对于序列化还是反序列化,都必须事先确定对象的类型.如果被序列化对象或者被反序 ...

  4. WCF技术剖析之十三:序列化过程中的已知类型(Known Type)

    原文:WCF技术剖析之十三:序列化过程中的已知类型(Known Type) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话) ...

  5. Luogu-P1027 Car的旅行路线 已知三点确定矩形 + 最短路

    传送门:https://www.luogu.org/problemnew/show/P1027 题意: 图中有n个城市,每个城市有4个机场在矩形的四个顶点上.一个城市间的机场可以通过高铁通达,不同城市 ...

  6. 653. 两数之和 IV - 输入 BST + HashSet

    653. 两数之和 IV - 输入 BST 题目描述 题解分析 最简单的方法就是遍历整棵树,找出所有可能的组合,判断是否存在和为 kk 的一对节点.现在在此基础上做一些改进. 如果存在两个元素之和为 ...

  7. 两数之和,两数相加(leetcode)

    我们都知道算法是程序员成长重要的一环,怎么才能提高算法呢, 出来在网上看视频之外,动手练习是非常重要的.leetcode 就是一个非常好的锻炼平台. 1. 两数之和,在 leetcode 里面是属于 ...

  8. LeetCode | No.1 两数之和

    题目描述: Given an array of integers, return indices of the two numbers such that they add up to a speci ...

  9. 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 ...

随机推荐

  1. 据说比Spring快44倍的web开发框架,不妨试试

    该框架称为:**light-4j **.官方网站简介:A fast, lightweight and more productive microservices framework.很简单,翻译过来就 ...

  2. create-react-app中的babel配置探索

    版本 babel-loader version:"8.1.0" create-react-app:"3.4.1" 三个配置 第一部分: { test: /\.( ...

  3. abp vnext 开发快速入门 3 实现权限控制

    上篇讲了abp vnext 实现了简单的增加操作的例子.删除更新查询基本类似,这里就不讲了,接下来说下如何实现角色权限控制. 再说之前,先说下如果想更加透彻的理解abp vnext的权限控制,最好是先 ...

  4. IO、NIO实现简单聊天室,附带问题解析

      本篇文章主要使用IO和NIO的形式来实现一个简单的聊天室,并且说明IO方法存在的问题,而NIO又是如何解决的.   大概的框架为,先提供思路和大概框架图--代码--问题及解决方式,这样会容易看一点 ...

  5. node的async模块

    废话不多说,直接开始 这个模块有几种方法.分别用于的不通的情况自己喜欢怎么用就怎么用 第一个方法,series  这个方法用于串行切无关联.什么意思那就是,里面的方法是一个一个执行的,每一个方法相互不 ...

  6. [leetcode/lintcode 题解] Amazon面试题:连接棒材的最低费用

    为了装修新房,你需要加工一些长度为正整数的棒材 sticks. 如果要将长度分别为 X 和 Y 的两根棒材连接在一起,你需要支付 X + Y 的费用. 由于施工需要,你必须将所有棒材连接成一根. 返回 ...

  7. 在ASP.NET Core中创建自定义端点可视化图

    在上篇文章中,我为构建自定义端点可视化图奠定了基础,正如我在第一篇文章中展示的那样.该图显示了端点路由的不同部分:文字值,参数,动词约束和产生结果的端点: 在本文中,我将展示如何通过创建一个自定义的D ...

  8. mongo安装和cmd运行命令

    一.安装方式 安装mongodb :www.mongodb.com next-->complete-->Instal MongoD as Service 不勾选 --> Instal ...

  9. SQL数据库优化总结

    1.在表中建立索引优先考虑 where.group by使用到的数据. 2.查询的sql语句中不要使用select * ,因为会返回许多无用的字段降低查询的效率,应该使用具体的字段代替*,只返回使用到 ...

  10. 03_Linux介绍、命令

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"软件测试"获取视频和教程资料! b站在线视频 Linu ...