题解 | #牛的编号异或问题# java

牛的编号异或问题

https://www.nowcoder.com/practice/b8139d2af0f64e6489f69cb173f170c1

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param left int整型
     * @param right int整型
     * @return int整型
     */
    public int rangeBitwiseXor (int left, int right) {
        // write code here
   if (left == 0) {
            return xorRange(right);
        } else {
            return xorRange(right) ^ xorRange(left - 1);
        }
    }

    // 辅助函数,用于计算从 1 到 n 的数值的异或结果
    // 连续数字的异或遵循以下模式:
    // 若 n % 4 = 0,则 XOR(1, 2, 3, ..., n) = n
    // 若 n % 4 = 1,则 XOR(1, 2, 3, ..., n) = 1
    // 若 n % 4 = 2,则 XOR(1, 2, 3, ..., n) = n + 1
    // 若 n % 4 = 3,则 XOR(1, 2, 3, ..., n) = 0
    private int xorRange(int n) {
        int[] x = {n, 1, n + 1, 0};
        return x[n % 4];
    }
}

Java代码

题目主要涉及到位运算和数学推导。

知识点:

  1. 位运算
  2. 数学规律:题目中指出了连续数字的异或有一定的模式。通过观察,可以发现这个模式与连续数字的个数与模 4 的余数有关。具体来说,当连续数字个数为 n 时,其按位异或的结果可以根据 n % 4 的值来确定。

代码解释:

  1. 在 rangeBitwiseXor 方法中,首先判断 left 是否为 0,因为在计算异或范围时有特殊情况。
  2. 对于非 0 的 left,通过计算 xorRange(right) ^ xorRange(left - 1) 来得到区间内所有牛的编号按位异或的结果。
  3. 在 xorRange 方法中,使用一个数组 x 存储了四种情况下的异或结果。根据输入数字 n 对 4 取余,选择相应的结果。

例如,当区间为 [left, right] = [3, 6] 时,计算过程如下:

  • xorRange(6) 会返回 6 ^ 7 = 1,因为 6 % 4 = 2,对应数组 x 中的值是 7。
  • xorRange(2) 会返回 2 ^ 3 = 1,因为 2 % 4 = 2,对应数组 x 中的值是 3。
  • 区间内所有牛的编号按位异或的结果是 xorRange(6) ^ xorRange(2) = 1 ^ 1 = 0。
全部评论

相关推荐

会飞的猿:我看你想进大厂,我给你总结一下学习路线吧,java语言方面常规八股要熟,那些java的集合,重点背hashmap八股吧,jvm类加载机制,运行时分区,垃圾回收算法,垃圾回收器CMS、G1这些,各种乐观锁悲观锁,线程安全,threadlocal这些。在进阶一些的比如jvm参数,内存溢出泄漏排查,jvm调优。我这里说的只是冰山一角,详细八股可以去网上找,这不用去买,都免费资源。mysql、redis可以去看小林coding,我看你简历上写了,你一定要熟,什么底层b+树、索引结构、innodb、mvcc、undo log、redo log、行级锁表级锁,这些东西高频出现,如果面试官问我这些我都能笑出来。消息队列rabbitmq也好kafka也好,学一种就行,什么分区啊副本啊确认机制啊怎么保证不重复消费、怎么保证消息不丢失这些基本的一定要会,进阶一点的比如LEO、高水位线、kafka和rocketmq底层零拷贝的区别等等。计算机网络和操作系统既然你是科班应该理解起来问题不大,去看小林coding这两块吧,深度够了。spring boot的八股好好看看吧,一般字节腾讯不这么问,其他的java大厂挺爱问的,什么循环依赖啥的去网上看看。数据结构的话科班应该问题不大,多去力扣集中突击刷题吧。项目的话其实说白了还是结合八股来,想一想你写的这些技术会给你挖什么坑。除此之外,还有场景题、rpc、设计模式、linux命令、ddd等。不会的就别往简历上写了,虽然技术栈很多的话好看些,但背起来确实累。总结一下,多去实习吧,多跳槽,直到跳到一个不错的中厂做跳板,这是一条可行的进大厂的路线。另外,只想找个小厂的工作的话,没必要全都照这些准备,太累了,重点放在框架的使用和一些基础八股吧。大致路线就这样,没啥太多难度,就是量大,你能达到什么高度取决于你对自己多狠,祝好。
点赞 评论 收藏
分享
人生一梦:24年我投暑期实习,它以我不是女的为理由拒绝了我查看图片
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务