LeetCode——2683. 相邻值的按位异或

通过万岁!!!

  • 题目:给你一个长度为n的数组derived,然后让你看下他能不能通过另外一个数组异或而来。规则是derivedi = originali 异或 originali+1,如果i位于最后i=n-1,则derivedi = originali 异或 original0。然后数组只有0和1两个值。
  • 思路:首先是要知道异或什么意思。异或就是相同为0,不同为1。我们看下derivedi = originali 异或 originali+1这个公式,其中derivedi我们是知道的,这里先看i=0时,先假设derived0=0,则original0和original1相同,如果original0=0,那么original1=0。然后我们继续模拟derived1,假设derived1=0,那么original2=0;如果derived1=1,那么original2只能等于1,因为他要与original1不能相同。所以我们可以看到,只要original0确定以后,后面的就都出来了。而且我们还能发现original0等于0或者等于1,都无所谓。上面的了解完了,我们就可以推导到originaln-1了。注意了,我们找到了originaln-1,但是我们只满足了derivedn-2,因为derivedn-1=originaln-1异或original0,而original0是我们假设的一个值。所以我们最后的结过只需要看originaln-1异或original0是不是等于derivedn-1就好了。
  • 技巧:数组、异或、位运算

java代码

java 复制代码
class Solution {
    public boolean doesValidArrayExist(int[] derived) {
        // 异或,相同为0,不同为1
        int len = derived.length;
        int[] temp = new int[len];
        // temp[0] = 0
        for (int i = 1; i < len; i++) {
            if (derived[i - 1] == 0) {
                temp[i] = temp[i - 1];
            } else {
                // x & 1 = x % 2
                temp[i] = (temp[i - 1] + 1) & 1;
            }
        }
        return (temp[len - 1] ^ temp[0]) == derived[len - 1];
    }
}
  • 总结:关键就是我们需要发现,其实这个original有两个,一个是以0开头的,第二个是以1开头的。这样我们就可以随便假设original0了。
相关推荐
城管不管几秒前
MySQL 慢查询完整排查
java·服务器·jvm·数据库·mysql·spring·面试
ZC跨境爬虫12 分钟前
LeetCode 88. 合并两个有序数组(双指针详解 + Java Python 实现)
java·python·算法·leetcode
Nil20815 分钟前
leetcode 238除了自身以外数组的乘积
数据结构·算法·leetcode
土司大王15 分钟前
LeetCode hot100——最长连续序列
数据结构·算法·leetcode
caimouse16 分钟前
ReactOS 图形系统分析(17):区域填充 — EngPaint / IntEngPaint(paint.c)
c语言·开发语言·算法
生态学者20 分钟前
Ecological Indicators | 机场鸟调的新方法:用 AWM-PC1 读懂干扰梯度下的鸟类群落
人工智能·算法·r语言·微信公众平台
北风toto23 分钟前
研发效能与后端核心技术全景指南:从CI/CD到共性组件实战
java·开发语言·ci/cd
01二进制代码漫游日记27 分钟前
C++基础入门速通
java·开发语言·c++
Herbert_hwt28 分钟前
第六章 Java深入理解接口、函数式接口与lambda表达式
java·开发语言·算法
API快乐传递者44 分钟前
电商竞品分析接口实战指南:从数据采集到决策洞察的全链路方案
java·python