给定一个整数 n,找到 1 到 n 范围内的异或
1 ^ 2 ^ 3 ^4 ^.....n 的异或;
暴力方法:
tc:o(n)
sc:o(1)
public int findexor(int n){ //naive/brute force approach: int val = 0; for(int i=1;i <p>最佳方法:<br> tc:o(1)<br> sc:o(1)<br></p> <pre class="brush:php;toolbar:false"> public int getexor(int n){ //better approach /** * one thing to observe is * 1 = 001 = 1 * 1 ^2 = 001 ^ 010 = 011= 3 * 1^2^3 = 011 ^ 011 = 0= 0 * 1^2^3^4 = 000^100 = 100= 4 * 1^2^3^4^5 = 100^101 = 001= 1 * 1^2^3^4^5^6 = 001^110 =111= 7 * 1^2^3^4^5^6^7 = 111^111=000= 0 * * what we can observer is : * * n%4==0 then result is: n * n%4 ==1 then result is: 1 * n%4 ==2 then result is: n+1 * n%4==3 then result is: 0 * * */ if(n%4==0) return n; else if(n%4 ==1) return 1; else if(n%4==2) return n+1; else return 0; }
登录后复制
如果我们必须找到 l 和 r 等范围之间的 异或怎么办
例如找到数字 4 和 7 之间的异或,即 4^5^6^7。
为了解决这个问题,我们可以利用与 getexor() 相同的最佳解决方案
首先我们将得到exor直到l-1,即getexor(l-1) = 1 ^ 2 ^ 3(因为l-1 = 3)……方程(1)
然后我们会发现 getexor(r) = 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7 ----equation(2)
最后,
result = equation(1) ^ equation(2) = (1 ^ 2 ^ 3) ^ (1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7) = (4^5^6^7)
登录后复制
public int findExorOfRange(int L, int R){ return getExor(L-1) ^ getExor(R); } public int getExor(int N){ //better approach /** * one thing to observe is * 1 = 001 = 1 * 1 ^2 = 001 ^ 010 = 011= 3 * 1^2^3 = 011 ^ 011 = 0= 0 * 1^2^3^4 = 000^100 = 100= 4 * 1^2^3^4^5 = 100^101 = 001= 1 * 1^2^3^4^5^6 = 001^110 =111= 7 * 1^2^3^4^5^6^7 = 111^111=000= 0 * * what we can observer is : * * N%4==0 then result is: N * N%4 ==1 then result is: 1 * N%4 ==2 then result is: N+1 * N%4==3 then result is: 0 * * */ if(N%4==0) return N; else if(N%4 ==1) return 1; else if(N%4==2) return N+1; else return 0; }
登录后复制
以上就是N 个数字的异或的详细内容,更多请关注抖狐科技其它相关文章!
-
C++ Lambda 表达式中 this 指针的使用场景
场景:在 c++++ lambda 表达式中使用 this 指针,可以访问成员函数和数据、捕获 this 指针。具体情况:访问成员函数:lambda 表达式可以通过 this 指针调用作用域中对象的成...
-
操作系统怎么来分类
操作系统分类有8种标准:用户数量、处理器架构、任务管理、实时性、分时系统、内核结构、代码开源性、操作系统家族。操作系统的分类 操作系统可根据以下标准进行分类: 1. 用户数量单用户操作系统(同一时间只...
-
Fami通新一周销量排行榜 《北海道连续杀人事件》登顶
Fami通公开新一周日本软硬件销量排行榜,新发售的《北海道连续杀人事件》登顶,《宇宙机器人》第二,也是唯一一款PS系游戏。榜单详情: 软件:1.【Switch】《北海道连续杀人事件》–20,9192....
-
理解 TypeScript 中的装饰器:第一原理方法
typescript 中的装饰器提供了一种强大的机制来修改类、方法、属性和参数的行为。虽然它们看起来像是一种现代的便利,但装饰器植根于面向对象编程中成熟的装饰器模式。通过抽象日志记录、验证或访问控制等...
-
建议所有iPhone升级!苹果iOS 17.7正式版发布:修复16个漏洞
9月17日消息,今天凌晨,苹果同时发布iOS 18正式版和iOS 17.7正式版更新,前者是年度大版本更新,后者则对漏洞进行了修复。更新日志显示,iOS 17.7提供了重要安全性修复,苹果建议所有...