初识算法中一些小tips👀
前言`
在写算法题的时候注意一些细节其实也很重要,复杂度说不定正因为这样的小细节就达标了呢。
🤞
一、位运算:
利用‘&’✔:
No.1
.在判断一个数奇偶性的时候,就可以使用n&1.
因为&的特性是对应位都是1才返回1否则为0
.所以1只有第一位是1,若奇数与1进行&运算则返回1,偶数就为0.
如1:00000001
与3:00000011进行&运算则返回了00000001为1
No.2 二进制的特性为当一个数为2n时,它的最高位为1,然后后面的位数都为0 所以再想一想,2n-1的二进制那它是不是就都是1了呢
例如:
16:10000
15:01111
那么我们想要判断一个数是否为2的完全平方数是不是就有一个神奇的方法了呢😉n&(n-1)
,如果为完全平方数那势必会返回0,这可比暴力节省时间多了阿伟。
当然也不是只有二进制可以这样,要学会举一反三
利用>>:
>>是指将一个数二进制位向右移一位
如
8: 1000
8>>:0100也就是8//2
所以我们若需要多次
将一个数 ➗2 or ✖2 or ✖2**n or ➗2**n话
那不妨使用>> or <<也可以优化代码
二、快速幂、乘
前言:当我们在进行大量乘法或者幂运算的时候那么就可能会超时
因此普通的*与**自然我们就该pass了🙄
这样处理就会快很多
快速幂:
def exponential_calculation(a,b):
ans = 1
while(b):
if( b & 1 ) : #判断奇偶性,而不是判断最后一位是0还是1
ans *= a
print(ans,b) #奇数 多乘以一个 a
a *= a #a自乘,构造 a^2 a^4 a^8 a^16..
b >>= 1 #b往右移一位 b/2 b/4 b/8 b/16 直到b为0
return ans
print(exponential_calculation(2,3))
快速乘的原理类似:
def t(a, b): # 迭代
ans = 0
while (b):
if b & 1:
ans += a # 实现对应位置相加
a += a ## 实现 a*2 a*4 a*8
b >>= 1
return ans
辗转相除求最大公约数
def gcd(m,n):
if n==0:
return m
z=m%n
return gcd(n,z)
而求公倍数也可利用 :
两数相乘除以公约数就是最小公倍数
这样比正常的枚举会快很多
总结
希望这些总结能帮助刚开始接触算法的你😬