异或

数组中只出现一次的数字 --剑指offer

大憨熊 提交于 2020-03-08 22:05:47
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 思路: 链接: https://www.nowcoder.com/questionTerminal/e02fdb54d7524710a7d664d082bb7811 来源:牛客网 首先:位运算中异或的性质: 两个相同数字异或=0 , 一个数和0异或还是它本身 。 当 只有一个数出现一次 时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消了。 依照这个思路,我们来看两个数(我们假设是AB)出现一次的数组。我们首先还是先异或,剩下的数字肯定是A、B异或的结果, 这个结果的二进制中的1,表现的是A和B的不同的位 。我们就取第一个1所在的位数,假设是第3位,接着把原数组分成 两组 ,分组标准是第3位是否为1。如此, 相同的数肯定在一个组 ,因为相同数字所有位都相同,而不同的数, 肯定不在一组 。然后把这两个组按照最开始的思路,依次异或,剩余的两个结果就是这两个只出现一次的数字。 我的代码 public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { int sum=0; for(int i =0;i < array

42.数组中只出现一次的数字

℡╲_俬逩灬. 提交于 2020-03-08 16:13:04
题目描述:   一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 思路分析:   该题想考的是位操作,我们分析如果数组中只有一个数字出现一次,其他数字都出现了两次,那么我们可以将数组中的元素异或最后的得到的值就是出现一次的数,因为相同数异或为0,所以很自然的最后的结果就是出现一次的数。那么我们首要任务就是将数组分成两个各自只包含一个只出现一次的数的数组。我们将数组中的元素进行异或,那么最终的结果一定是两个只出现一次数的异或结果。我们找到这个结果二进制中最低位的1的位置,就能在数组中将这两个数分开。 代码: public class Solution { public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) { int myxor=0; int flag=1; for(int i=0;i<array.length;i++){ myxor=myxor^array[i]; } while((myxor & flag)==0){ flag<<=1; //找到第一个1的位置 } for(int j=0;j<array.length;j++){ if((array[j]&flag)==0){ num1[0]=num1[0]^array[j]; }else{ num2

HDU-5269 ZYB loves Xor I

倾然丶 夕夏残阳落幕 提交于 2020-03-08 13:25:55
题目大意: 给出一个长度为n的数组A,让你求出lowbit(A[i]^A[j])的和对998244353取模的结果,其中i和j都属于[1,n]。lowbit(x)表示的是满足x xor 2^k > 0最小的2^k 解题思路: 因为数据规模很明显是5e4这样的规模,直接暴力搞必然超时,那么我们可以考虑一个问题,对于异或,如果x xor 2^k > 0的话,k一定是x二进制表示中最小的一位为1的数。 知道了这个还是无法求出来这个问题。因为涉及到异或问题,所以我们很容易想到字典树,字典树第h层的左子树表示数据自右向左第h位为0的,右子树表示第h位为1。 而这两个如果同时存在,那么这两个节点当前能表示的数的个数的乘积乘以1 << h就是这两个节点能表示的数的lowbit值。 最后答案乘以2即可。 代码: #include <cstring> #include <iostream> using namespace std; typedef struct node { int val; int nxt[2]; }Trie; const int maxn = 50005; const int mod = 998244353; int tot; Trie t[maxn * 30]; void Insert(int x) { int tmp, p = 0; for (int i = 0; i <

密码学总结(一)

二次信任 提交于 2020-03-07 23:56:59
一、密码常识 1.1 信息安全面临的问题以及解决方案 记住: 不要过于依赖密码保证信息安全,因为任何密码都会有被破解的一天; 不要使用低强度的密码; 不要使用保密的密码算法; 信息安全是一个系统的问题,密码只是信息安全的一部分; 1.2 加密三要素 明文和密文:加密处理的数据。 秘钥(key):用于生成明文的一串数字。 算法(algorithm):用于解决复杂问题的步骤。从明文生成密文的步骤,也就是加密的步骤,称为“加密算法",而解密的步骤则称为“解密算法"。 1.3 凯撒密码 恺撒密码(Caesar cipher)是一种相传尤利乌斯·恺撒曾使用过的密码。恺撒于公元前100年左右诞生于古罗马,是一位著名的军事统帅。 恺撤密码是通过将明文中所使用的字母表按照一定的字数“平移”来进行加密的。 为了讲解方便,我们用小写字母(a,b,c,…)来表示明文,用大写字母(A,B,C,…)来表示密文。 现在我们将字母表平移3个字母,于是,明文中的a在加密后就变成了与其相隔3个字母的D,以此类推。b变成E,c变成F,d变成G…v变成Y,w变成Z,而x则会回到字母表的开头而变成A,相应地,y变成B,z变成C。通过下图我们可以很容易地理解“平移"的具体工作方式。 比如英文 hello ,加密后的数据变为 KHOOR 。 恺撒密码的解密过程是使用与加密时相同的密钥进行反向的平移操作。比如上面例子

简单粗暴理解与实现机器学习之神经网络NN(一):神经网络基础详谈、感知器PLA、playground使用、神经网络发展史

白昼怎懂夜的黑 提交于 2020-03-07 19:18:45
文章目录 7.1 神经网络基础 学习目标 7.1.1 神经网络 7.1.1.1 感知机(PLA: Perceptron Learning Algorithm)) 7.1.2 playground使用 7.1.2.1 playground简单两类分类结果 但是这种结构的线性的二分类器,但不能对非线性的数据并不能进行有效的分类。如下面异或问题例子: 相当于给出这样的数据 7.1.2.2 单神经元复杂的两类-playground演示 那么怎么解决这种问题呢?其实我们多增加层或者多几个感知机即可解决?也就是下图这样的结构,组成一层的结构? 7.1.2.3多个神经元效果演示 7.1.3 神经网络发展史 7.1 神经网络基础 学习目标 目标 了解感知机结构、作用以及优缺点 了解tensorflow playground的使用 说明感知机与神经网络的联系 说明神经网络的组成 应用 无 7.1.1 神经网络 人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN) 。是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)结构和功能的 计算模型 。经典的神经网络结构包含三个层次的神经网络。 分别输入层,输出层以及隐藏层。 其中每层的圆圈代表一个神经元,隐藏层和输出层的神经元有输入的数据计算后输出,输入层的神经元只是输入。 神经网络的特点 1

位与&, 位或| ,位异或 ^ 总结

孤者浪人 提交于 2020-03-07 09:06:28
目录 按位与运算符(&) 参加运算的两个数据,按二进制位进行“与”运算。 运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; 即:两位同时为“1”,结果才为“1”,否则为0 例如:3&5 即 0000 0011& 0000 0101 = 00000001 因此,3&5的值得1。 另,负数按补码形式参加按位与运算。 “与运算”的特殊用途: (1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。 (2)取一个数中指定位 方法:找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。 例:设X=10101110, 取X的低4位,用 X & 0000 1111 = 00001110 即可得到; 还可用来取X的2、4、6位。 按位或运算符(|) 参加运算的两个对象,按二进制位进行“或”运算。 运算规则:0|0=0; 0|1=1; 1|0=1; 1|1=1; 即 :参加运算的两个对象只要有一个为1,其值为1。 例如:3|5 即 00000011 | 0000 0101 = 00000111 因此,3|5的值得7。  另,负数按补码形式参加按位或运算。 “或运算”特殊作用: (1)常用来对一个数据的某些位置1。 方法:找到一个数,对应X要置1的位,该数的对应位为1,其余位为零

异或的性质及运用

荒凉一梦 提交于 2020-03-06 23:16:56
异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。它与布尔运算的区别在于,当运算符两侧均为1时,布尔运算的结果为1,异或运算的结果为0。 简单理解就是不进位加法,如1+1=0,,0+0=0,1+0=1。 性质 1、交换律 2、结合律(即(a^b)^c == a^(b^c)) 3、对于任何数x,都有x^x=0,x^0=x 4、自反性 A XOR B XOR B = A xor 0 = A 异或运算最常见于多项式除法,不过它最重要的性质还是自反性:A XOR B XOR B = A,即对给定的数A,用同样的运算因子(B)作两次异或运算后仍得到A本身。这是一个神奇的性质,利用这个性质,可以获得许多有趣的应用。 例如,所有的程序教科书都会向初学者指出,要交换两个变量的值,必须要引入一个中间变量。但如果使用异或,就可以节约一个变量的存储空间: 设有A,B两个变量,存储的值分别为a,b,则以下三行表达式将互换他们的值 表达式 (值) : A=A XOR B (a XOR b) B=B XOR A (b XOR a XOR b = a) A=A XOR B (a XOR b XOR a = b) 类似地,该运算还可以应用在加密,数据传输,校验等等许多领域。 运用距离: 1-1000放在含有1001个元素的数组中

01 Trie——The XOR Largest Pair

元气小坏坏 提交于 2020-03-05 19:44:13
The XOR Largest Pair 01Trie的典型例题 两数字异或运算求最值: 思路: 将数字理解为一个长度为32的01串,异或运算求最值,应该贪心地从最高位到最低位取不同的数字。 步骤: 将所有数字插入Trie,然后遍历n个数字,对于每个数字从高位到低位, 依次匹配与它不同的数字(没有就匹配相同的)。 注意这样贪心是合理的,因为高位的数字影响大于低位数字影响总和。 譬如: 0x1000 0000 > 0x0111 1111。 代码部分的几处重要点: ①如此可依次从高位到低位提取出二进制数字。 for ( int i = up ; i >= 0 ; i -- ) int id = ( x >> i ) & 1 ; ②异或结果的求法: sum = ( sum << 1 ) | 1 // 乘2在加1 sum <<= 1 // sum = sum<<1 == sum*2 # include <stdio.h> # include <iostream> # include <cmath> # include <math.h> # include <string> # include <string.h> # include <algorithm> # include <stack> # include <queue> # include <vector> # include

程序中的位运算

99封情书 提交于 2020-03-02 22:29:36
位运算是我们常用的一种运算方式,在计算机底层逻辑中,存在着大量的位运算。因此,在你的计算机编程中,可以适当的使用一些位运算,不但会增加程序的运行效率,还会使你的程序看着更高级一些。下面依次说一下位运算的运算符,以及可以使用的操作。 按位与运算符& 与 & 运算符的运算规则如下: 0&0=0; 0&1=0; 1&0=0; 1&1=1;当且仅当两个数值都是1的条件下,结果才是1. 用处: 判断奇偶性 x & 1 == 0 则说明该x是奇数,反之,就是偶数。因为偶数的最后一位肯定是0,而奇数的最后一位为1,用1去和最后一位做与运算,如果是0,则说明是偶数,只有当是1的情况,才是奇数。 按位或运算 或 | 运算符的运算规则如下:0|0=0; 0|1=1; 1|0=1; 1|1=1;当且仅当二者都是为0的条件下,结果才为0.只要有一个数值是1,结果就是1. 具体的用处待补充 按位异或 ^ 运算 异或 ^ 运算符的运算规则如下:0 ^ 0 = 0; 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0; 当两个数值不同的时候,结果为1,否则为0. 用处: 0和任何数做异或运算,结果还是原数值 两个相同的数值进行异或运算,结果为0. 左移运算符 << 将一个数值的二进制为向高位移动若干位。如 4 << 1,将4的二进制向左移动一位,相当于原数值乘以2. 右移运算符 >>

逻辑运算详解

泪湿孤枕 提交于 2020-03-02 00:28:39
级别:括号>非>与>或、异或 (or和xor是同级的) 符号:非:not ¬ 与:and ∧ 或:or ∨ 异或:xor ⊕ 在这篇文章里,我们把逻辑运算简化为特殊的标化运算; 逻辑加法 通常用符号 "+" 或 " ∨ " 来表示。 逻辑加法 运算规则如下 : 0+0=0 , 0 ∨ 0=0 0+1=1 , 0 ∨ 1=1 1+0=1 , 1 ∨ 0=1 1+1=1 , 1 ∨ 1=1 从上式可见, 逻辑加法 有 " 或 " 的意义。也就是说,在给定的 逻辑变量 中, A 或 B 只要有一个为 1 ,其逻辑加的结果就为 1; 只有当两者都为 0 时逻辑加的结果才为 0 。 折叠 逻辑乘法与运算 逻辑乘法 通常用符号 "×" 或 " ∧ " 或 "·" 来表示。 逻辑乘法 运算规则如下 : 0×0=0 , 0 ∧ 0=0 , 0·0=0 0×1=0 , 0 ∧ 1=0 , 0·1=0 1×0=0 , 1 ∧ 0=0 , 1·0=0 1×1=1 , 1 ∧ 1=1 , 1·1=1 不难看出, 逻辑乘法 有 " 与 " 的意义。它表示只当参与运算的 逻辑变量 都同时取值为 1 时,其逻辑乘积才等于 1 。 折叠 逻辑否定非运算 逻辑非运算 又称 逻辑否运算 。其运算规则为 : 0=1 " 非 "0 等于 1 1=0 " 非 "1 等于 0 逻辑" 半加 " 运算(异或);