PHP处理含C/D/+操作符的多类型数组得分计算问题求解
原有代码问题排查
- 逻辑设计错误:同时修改输入数组
$nwe和临时存储数组$last,循环条件sizeof($nwe)会随数组元素删除动态变小,导致遍历不全、索引混乱。 - 操作符处理逻辑错误:
C操作的需求是删除上一条有效得分,原有代码错误检索原输入数组的键做删除,反而引入无效值;+操作使用的$test变量没有每次计算前重置,累加了历史错误数据。 - 缺少类型转换:输入的数字是字符串类型,未做数值转换直接参与计算,会出现隐式类型转换错误。
正确实现方案
该问题适合用栈(数组模拟)存储所有有效得分,全程不需要修改原输入数组,处理逻辑如下:
- 遇到数字字符串,转成整数压入栈
- 遇到
C,弹出栈顶元素(即移除上一条有效得分) - 遇到
D,取栈顶元素乘以2,计算结果压入栈 - 遇到
+,取栈顶两个元素求和,计算结果压入栈
最终对栈内所有元素求和即可得到结果。
可运行代码
// 测试输入 $ops = ["5","2","C","D","+"]; $scoreStack = []; foreach ($ops as $item) { switch ($item) { case 'C': array_pop($scoreStack); break; case 'D': $scoreStack[] = 2 * end($scoreStack); break; case '+': $scoreStack[] = $scoreStack[count($scoreStack)-1] + $scoreStack[count($scoreStack)-2]; break; default: $scoreStack[] = intval($item); } } // 输出最终得分总和 echo array_sum($scoreStack); // 上述测试用例输出结果为30,符合预期
内容的提问来源于stack exchange,提问作者Atif Raja
相关产品推荐
相关产品推荐

