C#统计balloon数量方法switch语句计数索引异常问题
C# 统计可组成单词balloon最大数量代码问题分析
问题代码
public int MaxNumberOfBalloons(string text) { // arr = {b, a, l, o, n} int[] arr = new int[5]; foreach (char ch in text) { switch (ch) { case 'b': Console.WriteLine(ch); arr[0]++; break; case 'a': arr[1]++; break; case 'l': arr[2]++; break; case 'o': arr[3]++; break; case 'n': arr[4]++; break; default: break; } } int counter = 0; Console.WriteLine("Before"); displayArr(arr); while (checkArr(arr)) { foreach (int i in arr) { if (i == 2 || i == 3) { arr[i] -= 2; } else { arr[i]--; } } counter++; } Console.WriteLine("After"); displayArr(arr); return counter; } public bool checkArr(int[] arr) { for (int i = 0; i < arr.Length; i++) { if (i == 2) { if (arr[i] > 1) continue; else return false; } if (i == 3) { if (arr[i] > 1) continue; else return false; } if (arr[i] == 0) return false; } return true; }
测试现象
输入text = "bb"时出现以下不符合预期的表现:
- switch分支中
case 'b'的Console.WriteLine执行2次,控制台打印两个'b',符合预期 - while循环执行前打印的arr数组内容为:
b b Before 0 2 2 2 2
- while循环执行后数组无变化,最终返回counter值为1,与预期不符
根因分析
你观测到的"switch语句未按预期工作"是错误判断,switch本身的逻辑完全正常,问题出在两处未正确区分数组索引和元素值的代码:
- 你未贴出实现的
displayArr函数存在逻辑错误:它错误遍历数组的元素值作为索引来打印内容,而非遍历索引打印对应位置的值。当输入为"bb"时,switch执行后实际arr的正确值为[2,0,0,0,0],如果displayArr的实现是foreach(int val in arr) { Console.WriteLine(arr[val]); },就会输出你看到的0、2、2、2、2的错误结果,让你误以为switch没有给索引0正确增量。 - while循环中的计数扣除逻辑也犯了相同错误:
foreach (int i in arr)遍历得到的是数组中存储的计数值,而非你需要的0~4的索引,导致代码一直在操作错误的数组位置,最终得到错误的counter返回值。
修复方案
将displayArr、while循环中的元素遍历改为按索引遍历即可,示例修改如下:
// 修正后的displayArr示例 public void displayArr(int[] arr) { for(int i = 0; i < arr.Length; i++) { Console.WriteLine(arr[i]); } } // 修正后的while循环内部逻辑 while (checkArr(arr)) { for(int i = 0; i < arr.Length; i++) { if (i == 2 || i == 3) { arr[i] -= 2; } else { arr[i]--; } } counter++; }
内容的提问来源于stack exchange,提问作者diego c
相关产品推荐
相关产品推荐

