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

C语言统计可组成含单个大写字母的banana数量的代码问题排查

解决C语言统计含至少一个大写字母的“banana”组合数问题

核心需求是统计输入字符串中能组成多少满足以下条件的字符组:

  • 每组包含1个B/b、3个A/a、2个N/n
  • 每组中至少存在一个大写字母(B、A、N任意一个)

问题分析

你的函数始终返回0,大概率是以下原因之一:

  1. 仅统计完全匹配特定大小写的单词(比如只找"Banana"),而非按字母数量统计组合
  2. 未区分全小写组合与含大写的组合,直接返回了全小写的统计结果
  3. 字母数量统计逻辑错误,导致总组合数计算为0

解决思路

要得到正确结果,需分两步计算:

  1. 先算不限制大小写时,能组成的总banana组数(只看字母总数是否满足1B/b、3A/a、2N/n)
  2. 再算全小写的banana组数(仅用小写b、a、n组成的组数)
  3. 最终结果 = 总组数 - 全小写组数(这样剩下的就是至少含一个大写的组数)

修正后的代码

#include <stdio.h>
#include <string.h>
#include <limits.h>

int count_banana_with_uppercase(const char *str) {
    // 分别统计大小写字母数量
    int upper_B = 0, lower_b = 0;
    int upper_A = 0, lower_a = 0;
    int upper_N = 0, lower_n = 0;

    for (int i = 0; str[i] != '\0'; i++) {
        switch(str[i]) {
            case 'B': upper_B++; break;
            case 'b': lower_b++; break;
            case 'A': upper_A++; break;
            case 'a': lower_a++; break;
            case 'N': upper_N++; break;
            case 'n': lower_n++; break;
            default: break;
        }
    }

    // 计算总组合数(不限制大小写)
    int total_b = upper_B + lower_b;
    int total_a = upper_A + lower_a;
    int total_n = upper_N + lower_n;
    int total_groups = INT_MAX;
    total_groups = total_b < total_groups ? total_b : total_groups;
    total_groups = (total_a / 3) < total_groups ? (total_a / 3) : total_groups;
    total_groups = (total_n / 2) < total_groups ? (total_n / 2) : total_groups;

    // 计算全小写组合数
    int lower_groups = INT_MAX;
    lower_groups = lower_b < lower_groups ? lower_b : lower_groups;
    lower_groups = (lower_a / 3) < lower_groups ? (lower_a / 3) : lower_groups;
    lower_groups = (lower_n / 2) < lower_groups ? (lower_n / 2) : lower_groups;

    // 返回非负结果
    return (total_groups >= lower_groups) ? (total_groups - lower_groups) : 0;
}

// 测试用例
int main() {
    printf("%d\n", count_banana_with_uppercase("Banana"));          // 输出1(含大写B)
    printf("%d\n", count_banana_with_uppercase("banana"));          // 输出0(全小写)
    printf("%d\n", count_banana_with_uppercase("BANANAbanana"));    // 输出1(总2组,扣除1组全小写)
    printf("%d\n", count_banana_with_uppercase("bAaNnA"));          // 输出1(含大写A、N)
    return 0;
}

代码关键点说明

  • 分别统计大小写字母,才能准确区分全小写组合
  • 用INT_MAX作为初始最小值,逐步取各字母条件的最小值,得到每组的最大可能数量(比如1个B/b对应1组,3个A/a对应1组,取最小的那个就是总组数)
  • 最终结果做非负判断,避免极端情况(比如全小写组数意外大于总组数)

内容的提问来源于stack exchange,提问作者Irma Ibrović

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 06:40:28