算法小技巧

初识算法中一些小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)

而求公倍数也可利用 :

两数相乘除以公约数就是最小公倍数

这样比正常的枚举会快很多

总结

希望这些总结能帮助刚开始接触算法的你😬

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值