位或例题Java 暴力法和前缀异或法
2021/8/31 22:36:19
本文主要是介绍位或例题Java 暴力法和前缀异或法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
我写的垃圾暴力法:
public static int[] xorQueries(int[] arr, int[][] queries) { int i = queries.length; int []querr= new int[i]; int idx = 0; int num; for (int [] s : queries) { num = 0; for (int d= s[0];d<=s[1];d++){ num = arr[d]^num; } querr[idx] = num; idx++; } return querr; }
人家写的前缀异或法
public int[] xorQueries(int[] arr, int[][] queries) { int n = arr.length; int[] xors = new int[n + 1]; for (int i = 0; i < n; i++) { xors[i + 1] = xors[i] ^ arr[i]; } int m = queries.length; int[] ans = new int[m]; for (int i = 0; i < m; i++) { ans[i] = xors[queries[i][0]] ^ xors[queries[i][1] + 1]; } return ans; }
它的原理是创建一个长度为arr.length+1的数组,每个元素n存放的是arr[0]连续位或到arr[n-1],第一个元素定为0方便位或别的元素,0位或任何数=任何数,第2个元素存放的是arr[0]^arr[2-1],这样以此存放。
首先为什么长度是arr.length+1呢,因为第一个元素必须是0,所以多了一位,其次为什么第一个必须是0呢,因为0位或任何数是等于任何数本身,目的就是当二维数组是{0,3}这样的值时,我们应该在arr数组数0-3也就是4个连续位或过去,而这个4个位或刚好存放在我们的数组第四个元素上,因为第一个元素是0,所以我们让第一个元素位或第4个元素就返回了正确的值,也就是这个部分
xors[queries[i][0]] ^ xors[queries[i][1] + 1]; 此时queries[i][0]是二维数组的0 queries[i][1]是二维数组的3,所以要+1,时间复杂度对比显而易见。
这篇关于位或例题Java 暴力法和前缀异或法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-12百万架构师第十五课:源码分析:Spring 源码分析:SpringMVC核心原理及源码分析|JavaGuide
- 2025-01-11有哪些好用的家政团队管理工具?
- 2025-01-11营销人必看的GTM五个指标
- 2025-01-11办公软件在直播电商前期筹划中的应用与推荐
- 2025-01-11提升组织效率:上级管理者如何优化跨部门任务分配
- 2025-01-11酒店精细化运营背后的协同工具支持
- 2025-01-11跨境电商选品全攻略:工具使用、市场数据与选品策略
- 2025-01-11数据驱动酒店管理:在线工具的核心价值解析
- 2025-01-11cursor试用出现:Too many free trial accounts used on this machine 的解决方法
- 2025-01-11百万架构师第十四课:源码分析:Spring 源码分析:深入分析IOC那些鲜为人知的细节|JavaGuide