c语言 异或_LeetCode基础算法题第186篇:一维数组逐次异或的结果

技术提高是一个循序渐进的过程,所以我讲的leetcode算法题从最简单的level开始写的,然后到中级难度,最后到hard难度全部完。目前我选择C语言,Python和Java作为实现语言,因为这三种语言还是比较典型的。由于篇幅和精力有限,其他语言的实现有兴趣的朋友请自己尝试。

如果有任何问题可以在文章后评论或者私信给我。

如果有朋友希望我讲些其他话题,请在评论区留言或者私信给我。

持续分享,敬请关注。

LeetCode 1486. 一维数组逐次异或的结果(XOR Operation in an Array)

问题描述:

给定一个整数n和一个整数start。

以此产生出一个数组nums,其中nums[i] = start + 2*i(i大于等于0),n == nums.length。

返回的所有元素的按顺序逐次XOR的结果。

注:

· 1 <= n <= 1000;

· 0 <= start <= 1000;

· n == nums.length;

示例:

a1cf8b4108c4b0802fc0092e34dce967.png

C语言实现:

这个题目很简单,一个循环就可以搞定。

为了直观,我们用例子来说明。

如果 n = 1, start = 1。那么生成的 nums = [1], 只有一个元素,不存在异或操作,最后要返回的结果res = 1。

如果 n = 4, start = 1。那么生成的 nums = [1,3,5,7],最后要返回的结果res = 1^3^5^7。即先计算出1^3的结果,然后拿这个结果再^5,得到另一个结果再^7。

根据这两个例子,我们可以将res初始化为nums[0],即start。 然后用 ^= 运算符计算res和下一个元素的异或结果并重新赋值给res,如此这样,遍历n-1次就可以得出最终的res的结果。

注意仅仅需要遍历n-1次,因为在遍历之前,res已经被赋值为nums[0]了,后面还有n-1个元素会参与异或运算。

代码如下:

75c9442917a463faf6a9816025c505b7.png
42f103f68d0432b1e0f3f3d641bf404d.png

这个算法的时间复杂度是O(n), 但我总觉得这个方法还不是最好的。

n,start 和最终结果res应该是存在一个对应关系的,如果能找到这个关系的数学表达形式,那么利用表达式计算,可以在O(1)内解决这个问题,可惜我没推导出来。

感兴趣的朋友可以试试,我觉得是可以的,如果发现了,欢迎交流分享。

java语言实现:

Java 的实现和C语言的实现基本一致。。

代码如下:

9cad3f37b58b9c9dfafac1af5b0983e8.png
3240e11ee8d2ac73e0ec31082f28f07f.png

python语言实现:

Python 的实现和C语言的实现基本一致。

代码如下:

88a0009f52b91aefaa8ecf8f2bfcfbc6.png
39cc623e6eb5ce9c81e72ec95fb31e7d.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值