LeetCode——运用到异或的题

两道使用异或的简单LeetCode题

(1)、LeetCode-解码异或后的数组——简单

业精于勤,荒于嬉;行成于思,毁于随。——韩愈

题目描述:

未知整数数组arr由n个非负数组成。经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。

给你编码后的数组 encoded 和原数组 arr 的第一个元素 first(arr[0])。

请解码返回原数组 arr 。可以证明答案存在并且是唯一的。

示例一: 输入:encoded = [1,2,3],first = 1 输出:[1,0,2,1]

解释:若arr = [1,0,2,1],那么first = 1且encoded = [1 XOR 0, 0 XOR 2, 2 XOR 1] = [1,2,3]

示例二: 输入:encoded = [6,2,7,3],first = 4 输出:[4,2,0,7,4]

提示:

2 <= n <= 10^4

encoded.length == n - 1

0 <= encoded[i] <= 10^5

0 <= first <= 10^5

这道题的思路是:

它们实现加密是通过原数组中的前一位与其后一位进行异或得到的,而因为题中已给出了原数组中的第一位元素,那么,我们就可推演出可通过原数组的第一位与加密后数组的第一位元素进行异或,之后将得到的原数组元素加入到原数组中,并且让其与加密后数组的第二位元素进行异或,以此类推,即可得到结果。

代码如下:

import java.util.Arrays;

public class LeetCode_解码异或后的数组 {
	
	static int[] encoded = {6, 2, 7, 3};
	static int first = 4;
	
	public static int[] decode(int[] encoded, int first) {
		int len = encoded.length;
		//创建一个原数组用来存储解码后的原始元素
		int[] arr = new int[len + 1];
		//将已知的第一位元素加入到arr数组中
		arr[0] = first;
		//然后将进行解码
		for (int i = 1; i <= len; i++) {
			arr[i] = arr[i - 1] ^ encoded[i - 1];
		}
		return arr;
	}

	public static void main(String[] args) {
		System.out.println(Arrays.toString(decode(encoded, first)));
	}
}

总结:
这道题难度是没有,唯一的要求是你知道并且理解了异或。

(2)、LeetCode-数组异或操作——简单

业精于勤,荒于嬉;行成于思,毁于随。——韩愈

题目描述:

给你两个整数,n 和 start 。

数组 nums 定义为:nums[i] = start + 2*i(下标从 0 开始)且 n == nums.length 。

请返回 nums 中所有元素按位异或(XOR)后得到的结果。

实例一: 输入:n = 5,start = 0 输出:8

解释:数组nums为[0,2,4,6,8],其中(02468)= 8。

实例二: 输入:n = 4,start = 3 输出:8

解释:数组nums为[3,5,7,9],其中(357^9)= 8。

实例三: 输入:n = 1,start = 7 输出:7

示例四: 输入:n = 10,start = 5 输出:2

提示:

1 <= n <= 1000

0 <= start <= 1000

n == nums.length

我的思路是:

由题意得,已知给出的start是数组nums中的第一位元素,并且可以根据start + 2 * i(i表示下标)得出后续的元素,此时就可以直接进行异或,最终得到的结果就是目标值。

代码如下:

public class LeetCode_数组异或操作 {
	
	static int n = 10;	//表示的数组nums的长度
	static int start = 5;	//表示的是数组nums的第一位元素
	
	public static int xorOperation(int n, int start) {
		//特殊判定:当n=1时,就说明数组中只有一个元素,那么,只要返回给出的那个起始元素即可
		if(n == 1) {
			return start;
		}
		int[] nums = new int[n];
		nums[0] = start;	//将start加入到数组中
		
		int x = 0;
		//计算出之后元素的同时,进行异或,得到最终结果
		for (int i = 0; i < n; i++) {
			x ^= (start + 2 * i);
		}
		return x;
	}

	public static void main(String[] args) {
		System.out.println(xorOperation(n, start));
	}
}

总结:

一开始,我是使用先将数组的所有元素算出来后,再进行异或运算的。后来发现,根本没有这个必要。我们可以直接一边算一边进行异或运算,这样的写法还能减少内存的损耗。(虽然只是一点点)
这与上面一道是相似的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值