【力扣每日打卡】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*代替的

浙公网安备 33010602011771号