求链式计算的最快实现方法(按左到右忽略运算优先级)
实现严格左到右计算的高效Calc方法
需求回顾
给定字符串形式的链式计算表达式(示例:
string input = "14 + 2 * 32 / 60 + 43 - 7 + 3 - 1 + 0 * 7 + 87 - 32 / 34",最大10MB),调用int Calc(string sInput)需返回正确结果。计算规则:
- 严格从左到右逐个数运算,忽略乘除优先级(例如
14 + 2 * 32结果为(14+2)*32=512)- 仅支持
+、-、*、/四种运算,且除法结果为整数(题目保证除法无小数、除数不为0)
高效实现思路
因为要处理最大10MB的字符串,必须避开内存密集型操作(比如Split拆分字符串会生成大量子串,内存开销极大)。我们直接通过索引定位数字和运算符,逐段解析计算,全程几乎无额外内存分配:
- 先解析第一个数字作为初始结果
- 循环定位后续的运算符和数字:
- 找到位于两个空格之间的运算符
- 定位下一个数字的起始与结束位置
- 将数字字符串解析为整数,结合当前运算符更新结果
- 重复直到遍历完整个表达式
完整C#实现代码
public static int Calc(string sInput) { if (string.IsNullOrWhiteSpace(sInput)) return 0; int currentIndex = 0; // 解析第一个数字 int spaceIndex = sInput.IndexOf(' ', currentIndex); int result = int.Parse(sInput.Substring(currentIndex, spaceIndex - currentIndex)); currentIndex = spaceIndex + 1; while (currentIndex < sInput.Length) { // 获取运算符 char op = sInput[currentIndex]; currentIndex += 2; // 跳过运算符和后续空格 // 获取下一个数字 spaceIndex = sInput.IndexOf(' ', currentIndex); int num; if (spaceIndex == -1) { // 处理最后一个无后续空格的数字 num = int.Parse(sInput.Substring(currentIndex)); currentIndex = sInput.Length; } else { num = int.Parse(sInput.Substring(currentIndex, spaceIndex - currentIndex)); currentIndex = spaceIndex + 1; } // 严格左到右执行运算 switch (op) { case '+': result += num; break; case '-': result -= num; break; case '*': result *= num; break; case '/': // 题目保证除法合法,无需额外判断 result /= num; break; } } return result; }
性能优化说明
- 避免了
Split操作,直接用IndexOf定位空格,减少内存分配,适配超大字符串场景 - 仅在必要时创建短子串用于解析整数,内存开销可控
- 循环逻辑简洁直接,无冗余计算,执行效率拉满
内容的提问来源于stack exchange,提问作者Impostor
相关产品推荐
相关产品推荐

