字符串算术表达式中关于负数的处理
负数转成(0-n)
力扣上有关于算术表达式的题目,
在实际处理算术表达式时,
在把字符串转成表达式中,会有负数出现,可以把负数处理成(0-n)
的形式
例如:-1 -> (0-1)
PS:自己只做实现,关于算法优化就不存在了,也为了方便理解,重复的代码也没做优化.
主要分为4种情况:
1.负号出现在首位, -1+1
2.负号出现在首位,且后面存在'(', -(1+1)
3.负号在中间, 1+-1
4.负号在中间,且后面存在'(', 1+-(1+1)
2,4 也就比 1,2 多了一步判断中间是否有其他括号,要在哪里加上最后的')', eg: 1+-(1+(1+1))
测试数据
-1
--1
--1--2
--(1--2)
1+-(1+1)
-1--1
1+(1+-1)--(1-1) + 1 +-1
-0.11+-2.2
下面直接贴上实现
//处理删除空格 /r/n /r /t
void negative2Expression(std::string& str, int start = 0)
{
int ret = str.find('-', start);
if (-1 != ret)
{
negative2Expression(str, ret + 1);
}
else
{
return;
}
if (ret == 0) { //首位是负数 -1
str.insert(ret, "0");
str.insert(ret, "(");
//下一位是不是 ( ; +3 因为添加了 0 (
if (str[ret + 3] == '(')
{
int count_bracket = 0;
//过滤中间出现的 ()
for (int j = ret + 3; j < str.size(); j++) { // (0- ( (1+1) + (1+1) )
if (str[j] == '(') {
count_bracket++;
}else if (str[j] == ')'){
count_bracket--;
}
if (count_bracket == 0)
{
str.insert(j, ")");
break;
}
}
}
else {
for (int j = ret + 3; j < str.size(); j++) {// ret + ( , 0 , -
if (!(str[j] >= '0' && str[j] <= '9') && str[j] != '.') {
str.insert(j, ")");
ret = j;
break;
}
else if (j == str.size() - 1)
{
str.push_back(')');
break;
}
}
}
}
else {
//不是首位 检测当前 符号的下一个是不是 '-'
if (str[ret] == '-' && !(str[ret - 1] >= '0' && str[ret - 1] <= '9') && str[ret - 1] != ')') // 1 + -(1+1)
{
str.insert(ret, "0");
str.insert(ret, "(");
//下一位是不是 ( ; +3因为添加了 0 (
if (str[ret + 3] == '(') {
int count_bracket = 0;
//过滤中间出现的 ()
for (int j = ret + 3; j < str.size(); j++) {
if (str[j] == '(') {
count_bracket++;
}
else if (str[j] == ')')
{
count_bracket--;
}
if (count_bracket == 0)
{
str.insert(j, ")");
break;
}
}
}
else {
for (int j = ret + 3; j < str.size(); j++) {// i + ( , 0 , -
//下一个符号不是数字, 表示一个完整数字
if (!(str[j] >= '0' && str[j] <= '9') && str[j] != '.') {
str.insert(j, ")");
break;
}
//到达表达式的末尾,表示一个完整数字
else if (j == str.size() - 1)
{
str.push_back(')');
break;
}
}
}
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗