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

通过万岁!!!

  • 题目:给你一个长度为n的数组derived,然后让你看下他能不能通过另外一个数组异或而来。规则是derived[i] = original[i] 异或 original[i+1],如果i位于最后i=n-1,则derived[i] = original[i] 异或 original[0]。然后数组只有0和1两个值。
  • 思路:首先是要知道异或什么意思。异或就是相同为0,不同为1。我们看下derived[i] = original[i] 异或 original[i+1]这个公式,其中derived[i]我们是知道的,这里先看i=0时,先假设derived[0]=0,则original[0]和original[1]相同,如果original[0]=0,那么original[1]=0。然后我们继续模拟derived[1],假设derived[1]=0,那么original[2]=0;如果derived[1]=1,那么original[2]只能等于1,因为他要与original[1]不能相同。所以我们可以看到,只要original[0]确定以后,后面的就都出来了。而且我们还能发现original[0]等于0或者等于1,都无所谓。上面的了解完了,我们就可以推导到original[n-1]了。注意了,我们找到了original[n-1],但是我们只满足了derived[n-2],因为derived[n-1]=original[n-1]异或original[0],而original[0]是我们假设的一个值。所以我们最后的结过只需要看original[n-1]异或original[0]是不是等于derived[n-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开头的。这样我们就可以随便假设original[0]了。
相关推荐
Boilermaker19925 分钟前
【Java EE】Spring AOP
java·java-ee
CoovallyAIHub25 分钟前
论文精读|YOLO系列最新模型水下实测:v8为何能斩获80.9% mAP?
深度学习·算法·计算机视觉
Code blocks30 分钟前
SpringBoot中策略模式使用
java·spring boot·后端·mybatis·策略模式
Ghost-Face30 分钟前
《算法导论》笔记--归并排序 & 算法原理
算法
污领巾38 分钟前
虚幻GAS底层原理解剖三 (GA)
java·游戏引擎·虚幻
C4程序员1 小时前
北京JAVA基础面试30天打卡02
java·开发语言·面试
好好研究1 小时前
Java基础学习(一):类名规范、返回值、注释、数据类型
java·学习·算法
C++、Java和Python的菜鸟1 小时前
第二章 矩阵
人工智能·算法·矩阵
_码农121381 小时前
java web 未完成项目,本来想做个超市管理系统,前端技术还没学。前端是个简单的html。后端接口比较完善。
java·前端·html
阑梦清川1 小时前
搜索算法---填涂颜色问题(在外围添加多余的0的求解方法)
算法