leetcode 29. 两数相除

本文详细解析了LeetCode第29题“两数相除”的算法实现,不使用乘法、除法和模运算符完成两数相除,通过位运算技巧高效求解商值,提供了Python代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

'''
leetcode 29. 两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
'''

class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        if dividend==0:# 被除数为0,商为0
            return 0
        if divisor==1:# 除数为1,直接返回被除数
            if dividend<0:
                return max(dividend,-2**31)
            else:
                return min(dividend,2**31-1)
        if divisor==-1:# 除数为1,直接返回被除数
            if dividend>0:
                return max(0-dividend,-2**31)
            else:
                return min(0-dividend,2**31-1)
        if dividend>0 and divisor>0:
            return min(self.helper(dividend,divisor),2**31-1)
        if dividend>0 and divisor<0:
            return max(0-self.helper(dividend,0-divisor),-2**31)
        if dividend<0 and divisor<0:
            return min(self.helper(0-dividend,0-divisor),2**31-1)
        if dividend<0 and divisor>0:
            return max(0 - self.helper(0-dividend, divisor), -2 ** 31)
    def helper(self,a,b):
        '''
        其中a和b都是正整数,求商,实际上是求被除数中能够最多减去多少个除数,得到的结果小于除数
        :param a:
        :param b:
        :return:

        使用循环做减法,统计做减法的次数,显然会超时。这里引入位运算的技巧
        任何整数(这里只考虑正整数)都可以表示成2的整数幂的线性组合,即被除数可以这样表示
        如45   /  4   除数45,被除数4
        用temp统计输出的商
        101101
        首先将4左移k位数,(这里巧妙地运用了位运算来实现乘法,将4左移一位就是将4放大2倍)
        使得4*(2**k)的结果是能让k取得最大并且该数值不超过45的,得到k=3,说明45至少包含(2**3)=8 个4    temp+=8
        再将45-4*8=13,继续搜索下一个k值,注意这次搜索时不需要从k=1开始搜索,而是从k=3(继上次计算得到的k)开始搜索,k-=1
        得到k=1  13-4*(2**1)=5   即13中至少包含2**k=2个4   temp+=2
        再将13-4*2=5   从k=0开始搜索,发现k=0满足要求,temp+=(2**0)=10+1=11
        再将5-4=1  1<4  终止循环
        '''
        output=0# 返回结果,商
        if a<b:
            return 0
        if a==b:
            return 1
        k=0# 意味着a至少大于b*(2**0)=b
        c=b
        result=0
        while (c < a):
            c = c << 1
            k += 1
        k-=1
        result+=1<<k
        # print('here',result,k)
        a-=b<<k
        while(a>b):
            # 找到最大的k,使得b*(2**k)<a
            temp=b<<k
            while(temp>a):
                temp=temp>>1
                k-=1
            a-=temp
            result+=1<<k
        return result

if __name__=="__main__":
    print(Solution().divide(45,4))
    print(Solution().divide(7,-3))
    assert Solution().divide(10,3)==3
    assert Solution().divide(7,-3)==-2

 

内容概要:本文档详细介绍了一个基于MATLAB实现的电力负荷预测项目,该项目运用遗传算法(GA)优化支持向量回归(SVR)和支持向量机(SVM)模型的超参数及特征选择。项目旨在解决电力系统调度、发电计划、需求侧响应等多个应用场景中的关键问题,特别是在应对高比例可再生能源接入带来的非线性、非平稳负荷预测挑战。文中涵盖了从数据接入、特征工程、模型训练到部署上线的全流程,包括详细的代码示例和GUI设计,确保方案的可复现性和实用性。 适用人群:具备一定编程基础,尤其是熟悉MATLAB语言和机器学习算法的研发人员;从事电力系统调度、电力市场交易、新能源消纳等相关领域的工程师和技术专家。 使用场景及目标:①通过构建面向小时级别的滚动预测,输出高分辨率负荷轨迹,为日内与日前滚动调度提供边际成本最小化的依据;②在负荷高峰和供给紧张时,通过价格信号或直接负荷控制实施需求侧响应,提升削峰效率并抑制反弹;③为灵活性资源(调峰机组、储能、可中断负荷)提供更清晰的出清路径,降低弃风弃光率,提升系统整体清洁度;④帮助市场主体更准确地评估边际出清价格变化,提高报价成功率与收益稳定性,同时降低由预测偏差带来的风险敞口;⑤在运维与审计场景中,对预测产生的原因进行说明,保障业务侧与监管侧的可追溯性。 阅读建议:此资源不仅提供了完整的代码实现和GUI设计,更注重于理解GA优化过程中涉及到的数据处理、特征构造、模型选择及评估等核心步骤。因此,在学习过程中,建议结合实际案例进行实践,并深入研究每个阶段的具体实现细节,特别是适应度函数的设计、超参数空间的定义以及多样性维护机制的应用。此外,关注项目中关于数据对齐、缺失值处理、特征标准化等方面的最佳实践,有助于提高模型的鲁棒性和泛化能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值