You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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本身的逻辑完全正常,问题出在两处未正确区分数组索引和元素值的代码:

  1. 你未贴出实现的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正确增量。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:18:03