You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

LeetCode复数乘法题中stoi()触发invalid_argument报错求助

解决stoi解析复数时的invalid_argument错误

首先看你代码里的几个关键问题,这也是导致报错的核心原因:

1. 变量混淆:错误复用字符串a处理第二个复数b

你代码里的a2b2都是从a中截取的,但它们本该对应第二个复数b的实部和虚部。比如:

int a2 = stoi(a.substr(0, bplus), nullptr); // 这里应该用b.substr,不是a.substr
int b2 = stoi(a.substr(bplus + 1, bi), nullptr); // 同样,这里必须用b.substr

这种混淆会导致处理第二个复数时,取到的是第一个复数的内容,完全不符合预期,自然会让stoi解析错误的字符串。

2. substr的第二个参数用错了:它是长度,不是结束索引

string::substr(pos, len)的第二个参数是截取的长度,而非结束位置。你之前直接传了aibi(也就是'i'的索引),这会导致截取的字符串长度远超实际需要,甚至包含'i'字符或者超出字符串范围,stoi遇到非数字字符就会抛出invalid_argument

比如对于"-1+-1i"aplus是1,ai是4,a.substr(aplus+1, ai)会从索引2开始截取4个字符,但原字符串总长度仅为5,实际截取的是"-1i"stoi无法解析包含'i'的字符串,直接报错。


修正后的完整代码

下面是修复后的代码,我标注了关键修改点:

class Solution {
public:
    string complexNumberMultiply(string a, string b) {
        // 处理第一个复数a
        int a_plus = a.find('+');
        int a_i = a.find('i');
        int a_real = stoi(a.substr(0, a_plus)); // 实部:从开头截取到'+'位置
        // 虚部:从'+'后开始,截取到'i'前,长度为i的位置减去+1的位置
        int a_imag = stoi(a.substr(a_plus + 1, a_i - (a_plus + 1)));

        // 处理第二个复数b(修复了之前混淆a和b的问题)
        int b_plus = b.find('+');
        int b_i = b.find('i');
        int b_real = stoi(b.substr(0, b_plus)); // 用b.substr获取b的实部
        int b_imag = stoi(b.substr(b_plus + 1, b_i - (b_plus + 1))); // 用b.substr获取b的虚部

        // 复数乘法计算逻辑
        int res_real = a_real * b_real - a_imag * b_imag;
        int res_imag = a_real * b_imag + b_real * a_imag;

        return to_string(res_real) + "+" + to_string(res_imag) + "i";
    }
};

额外小优化

其实虚部的截取可以简化写法,只要明确截取到'i'之前即可,比如:

int a_imag = stoi(a.substr(a_plus + 1, a_i - a_plus - 1));

这样不管实部和虚部是正数还是负数,stoi都能正确解析带负号的数字字符串,测试"-1+-1i""1+-1i"这类输入都不会再报错。

内容的提问来源于stack exchange,提问作者Drashti

火山引擎 最新活动