LeetCode学习-第三十八天

50 篇文章 0 订阅
28 篇文章 0 订阅

第三十八天

我使用的C++,错误的地方请见谅,文章初衷仅用来督促本人学习,如果恰巧能够给你带来帮助,我会十分开心。

一、537. 复数乘法

复数 可以用字符串表示,遵循 “实部+虚部i” 的形式,并满足下述条件:

实部 是一个整数,取值范围是 [-100, 100]
虚部 也是一个整数,取值范围是 [-100, 100]
i2 == -1
给你两个字符串表示的复数 num1 和 num2 ,请你遵循复数表示形式,返回表示它们乘积的字符串。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/complex-number-multiplication
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    string complexNumberMultiply(string num1, string num2) {//实部相乘虚部相乘
        string ans = "";
        int i = num1.find('+'), j = num2.find('+');//分别找到两个+的位置
        int a = stoi(num1.substr(0, i));//将第一个实部提取
        int b = stoi(num1.substr(i + 1, num1.size() - i - 1));//将第一个虚部提取
        int c = stoi(num2.substr(0, j));
        int d = stoi(num2.substr(j + 1, num2.size() - j - 1));
        ans += to_string(a * c - b * d);//转为字符串
        ans += "+";
        ans += to_string(a * d + c * b);
        ans += "i";
        return ans;
    }
};

虚数乘法法则
在这里插入图片描述
str相关函数的用法

在这里插入图片描述
在这里插入图片描述

二、29. 两数相除

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/divide-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    int divide(int dividend, int divisor) {
        int sign = ((((dividend ^ divisor) >> 31) & 0x01) == 1) ? -1 : 1;//判断符号 
        long result = 0;
        long dividend_long = abs((long)dividend);//换为长整型避免溢出
        long divisor_long = abs((long)divisor);
       /* while(dividend_long >= divisor_long){//循环减去除数
            dividend_long -= divisor_long;
            result++;
        }*/
        while(dividend_long >= divisor_long){//类二分法
            long i = 1;
            long tmp = divisor_long;
            while(dividend_long >= tmp){//在能够除的情况下,除数乘成指数增长
                dividend_long -= tmp;
                result += i;
                i = i << 1;//i * 2
                tmp = tmp << 1;

            }
        }
        result *= sign;
        if(result > INT_MAX || result < INT_MIN){
            return INT_MAX;
        }
        return (int)result;
    }
      
};

在不使用既定除法的原则下,就是使用被减数不断减去除数的方法去实现,简单的方案是每次减去一个除数,进阶就是除数成指数增长,这样时间复杂度可以达到O(logN);

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值