福哥答案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 Boot 2.x基础教程:进程内缓存的使用与Cache注解详解

    随着时间的积累,应用的使用用户不断增加,数据规模也越来越大,往往数据库查询操作会成为影响用户使用体验的瓶颈,此时使用缓存往往是解决这一问题非常好的手段之一.Spring 3开始提供了强大的基于注解的缓 ...

  2. Linux基础入门(一)初识Shell

    Linux基础入门(一)初识Shell shell是什么 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell ...

  3. xss小游戏源码分析

    配置 下载地址:https://files.cnblogs.com/files/Lmg66/xssgame-master.zip 使用:下载解压,放到www目录下(phpstudy),http服务下都 ...

  4. OpenXml demo

    class OpenXmlDemo { /* * excel 对象结构 * SpreadsheetDocument * >WorkbookPart * >WorksheetPart * & ...

  5. Logging with ElasticSearch, Kibana, ASP.NET Core and Docker

    好久不见,前两周经历了人生第一次"伪牛市",基金和股市大起大落,更加坚信"你永远赚不到超出你认知范围之外的钱,除非靠着运气",老韭菜诚不欺我也. 当能力与野心不 ...

  6. Spring事务管理接口定义

    Spring事务管理接口介绍 Spring事务管理接口: PlatformTransactionManager: (平台)事务管理器 TransactionDefinition: 事务定义信息(事务隔 ...

  7. vue+springboot文件下载

    //vue element-ui <el-button size="medium" type="primary" @click="downloa ...

  8. MySQL之字段数据类型和列属性

    数据类型: 对数据进行统一的分类,从系统的角度出发,为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中将数据类型分成了三大类:数值类型.字符串类型.时间日期类型. 数值型: 数值型数据: ...

  9. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU特性那些事(1)- 概览

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的基本特性. 恩智浦半导体于2017年开始推出的i.MX RT系列重新定义了MCU,其第一款芯片i. ...

  10. 每日一道 LeetCode (2):整数反转

    题目:整数反转 题目来源:https://leetcode-cn.com/problems/reverse-integer 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示 ...