安柯九

导航

【力扣每日打卡】2022.2.25 复数乘法

这题没什么难度,不涉及算法,只考察最基本的编程能力。

因为给你的是一个string,而你要进行乘法的运算就得用int。

我是用最笨的方法,将string里面的东西一位一位解析转化为int,在进行运算,这里注意符号也要考虑。

代码比较长,但比较简单明了。

特别注意的是将int转为string时的to_string()函数会保留int里面的符号

class Solution {
public:
    string complexNumberMultiply(string num1, string num2) {
        int icnt=0;
        int jcnt=0;
        string shi1;
        string shi2;
        string xu1;
        string xu2;
        int shifuhao1=1;
        int shifuhao2=1;
        int xufuhao1=1;
        int xufuhao2=1;
        if(num1[0]=='-'){
            shifuhao1=-shifuhao1;
            icnt++;
        }
        if(num2[0]=='-'){
            shifuhao2=-shifuhao2;
            jcnt++;
        }
        while(icnt<num1.size()){
            if(num1[icnt]=='+'){
                break;
            }
            shi1+=num1[icnt];
            icnt++;
        }
        while(jcnt<num2.size()){
            if(num2[jcnt]=='+'){
                break;
            }
            shi2+=num2[jcnt];
            jcnt++;
        }
        string s1(shi1);
        int shibu1 = atoi(s1.c_str());
        string s2(shi2);
        int shibu2 = atoi(s2.c_str());
        shibu1=shibu1*shifuhao1;
        shibu2=shibu2*shifuhao2;

        if(num1[icnt+1]=='-'){
            xufuhao1=-xufuhao1;
            icnt++;
        }
        icnt++;
        if(num2[jcnt+1]=='-'){
            xufuhao2=-xufuhao2;
            jcnt++;
        }
        jcnt++;
        cout<<xufuhao1<<xufuhao2<<endl;
        while(num1[icnt]!='i'){
            xu1+=num1[icnt];
            icnt++;
        }
        while(num2[jcnt]!='i'){
            xu2+=num2[jcnt];
            jcnt++;
        }

        string s3(xu1);
        int xubu1 = atoi(s3.c_str());
        string s4(xu2);
        int xubu2 = atoi(s4.c_str());
        xubu1=xubu1*xufuhao1;
        xubu2=xubu2*xufuhao2;
        
        int ansshi=shibu1*shibu2 - xubu1*xubu2;
        int ansxu=shibu1*xubu2 + shibu2*xubu1;
        
        string res;
        res+=to_string(ansshi);
        res+='+';
        res+=to_string(ansxu);
        res+='i';

        return res;
    }
};

但是空间复杂度比较高

 

 因为定义太多变量了

 

后来室友说可以用sscanf 和sprintf 利用正则提取,于是我去试了一下

发现代码量很少,空间效率也很高。

class Solution {
public:
    string complexNumberMultiply(string num1, string num2) {
        int a1,a2;
        int b1,b2;
        const char* a = num1.c_str();
        const char* b = num2.c_str();
        sscanf(a,"%d+%di",&a1,&b1);
        sscanf(b,"%d+%di",&a2,&b2);
        char* res=(char*)malloc(sizeof(char)*13);
        sprintf(res,"%d+%di",a1*a2-b1*b2,a1*b2+a2*b1);
        return res;
    }
};

这里要注意 sscanf函数必须是对于char* 不能直接用string 

其中将string转化为char*,使用了c_str()函数,必须在定义char*时加入const 否则会报错

最后返回的string倒是可以用char*代替的

 

posted on 2022-02-25 10:35  安柯九  阅读(54)  评论(0)    收藏  举报