代码源每日一题 2022 5 - 1

这篇博客探讨了一道算法题,涉及异或运算在求和问题中的应用。作者通过分析二进制表示,提出寻找每个数位上1和0的规律,将问题转化为计算后续数位上不同数值的个数。采用前缀和的思想,最终实现了高效的解决方案。
摘要由CSDN通过智能技术生成

  

题目的意思就是求和.

首先,一眼看出去就能想到一个o(n^2)的时间复杂度的代码,但是很明显不能这么写。

解题思路:

1.题目为异或运算,想到二进制。

2.先模拟一次可以运行的简单运算,比如题目所给的:1^2 + 1^3 + 2^3,我们将1^2+1^3拿出来因为这就是一个循环的运算,我们将其展开 001 ^ 010 + 001 ^ 011 = 5 ,很明显的如果我们继续进行这样的二进制运算,那我们将其变成二进制的效果就没有体现出来,所以我们进行下一步。

3. 我们将 1 2 3 的二进制分别写出来,就是 001 010 011 ,我们知道异或运算的规则,所以我们可以将每一个数字之间的异或展现成每一个数位之间的异或运算。例如:最低位为1的时候 ,只有其他的数出现0的时候才会对我们的结果产生影响。然后我们就找他后面的数在最低位上位0的数的个数,很显然是一个, 所以 这个最低位对结果的影响就是 1 * 1。 所以题目就变得十分的简单 我们只需要知道这个数的每一位数是1还是0 然后找他之后的数在这个数位上与他不同的数的个数的总和就行。

4.所以我们将题目转换完之后我们就是只要知道每一个数的每一个数位上是1还是0,以及这个数之后的所有数在每一个数位上的0的总和以及1的总和。这就是我们要解决的本题的问题,方法有很多,我用的是差不多前缀和的方法。

下面就是我的代码

#include<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值