【简单】LCP 01. 猜数字

【题目描述】
小A 和 小B 在玩猜数字。小B 每次从 1, 2, 3 中随机选择一个,小A 每次也从 1, 2, 3 中选择一个猜。他们一共进行三次这个游戏,请返回 小A 猜对了几次?输入的guess数组为 小A 每次的猜测,answer数组为 小B 每次的选择。guess和answer的长度都等于3。
来源:leetcode
链接:https://leetcode-cn.com/problems/guess-numbers/submissions/
【示例1】
输入:guess = [1,2,3], answer = [1,2,3]
输出:3
解释:小A 每次都猜对了。
【示例2】
输入:guess = [2,2,3], answer = [3,2,1]
输出:1
解释:小A 只猜对了第二次。
【思路】
两个数组相同下标对应数字一一对比即可
【代码】

class Solution {
public:
    int game(vector<int>& guess, vector<int>& answer) {
        int cnt=0;
        for(int i=0;i<guess.size();i++)
            if(guess[i]==answer[i])
                cnt++;
        return cnt;
    }
};
<think>我们被要求解决LCP 66. 最小展台数量问题,并对C语言代码进行纠错和优化。 根据引用[2]和引用[3]、引用[4]中的代码示例,我们可以总结出算法的正确步骤: 1. 创建一个长度为26的数组(初始化为0)来记录每个字符(展台类型)在整个过程中所需的最大数量。 2. 遍历每一天的需求(字符串数组demand中的每个字符串): a. 对于每一天,创建一个长度为26的临时数组(初始化为0),用于统计当天每个字符出现的次数。 b. 遍历当天的字符串,统计每个字符出现的次数(通过字符减去'a'得到索引)。 c. 遍历26个字符,更新全局最大数组:将全局数组中每个字符的最大数量更新为当前全局最大值与当天该字符出现次数的较大值。 3. 最后,将全局最大数组中的26个值求和,即为所需的最小展台数量。 但是,引用[3]中提供的C++代码存在一个问题:在内层循环中,用于更新全局数组的循环变量使用了与外层循环相同的变量名'i',这会导致内层循环覆盖外层循环的变量,造成错误。 我们来看引用[3]的代码片段: for(int i=0;i<demand.size();i++){ int b[30]; memset(b,0,sizeof b); for(int j=0;j<demand[i].size();j++){ b[demand[i][j]-'a']++; } for(int i=0;i<26;i++){ // 这里的内层循环变量i覆盖了外层循环的i a[i]=max(a[i],b[i]); } } 在C++中,内层循环的i会覆盖外层循环的i,这会导致外层循环的i被修改,从而提前退出循环。因此,我们需要修改内层循环的变量名,比如改为k。 此外,引用[2]中提到了一个原始错误代码(Python版本)的Bug:在更新最大值数组时,不是直接取最大值,而是当当前计数大于最大值时只将最大值加1,这是错误的。 现在,用户要求用C语言代码,并对其进行纠错和优化。我们根据引用[3]的C++代码改写为C语言,并修正变量名冲突的问题。 同时,我们可以考虑以下优化: - 由于字符集固定为26个小写字母,使用固定大小的数组效率很高。 - 避免重复初始化:在每一天的循环中,我们都需要一个临时数组,我们可以将其定义在循环内部,并初始化为0。 另外,注意引用[4]的Java代码和引用[2]的Python代码都是正确的,我们可以参考。 因此,我们给出C语言的正确代码: 步骤: 1. 定义一个长度为26的整型数组maxCount(初始化为0),用于记录每个字符所需的最大数量。 2. 遍历每一天(即遍历字符串数组demand,数组长度为n): a. 定义一个长度为26的临时数组temp(初始化为0),用于记录当天每个字符的出现次数。 b. 遍历当天的字符串demand[i]的每个字符,将对应位置的temp数组元素加1。 c. 遍历26个字符,更新maxCount数组:maxCount[j] = max(maxCount[j], temp[j]); 3. 计算maxCount数组的和并返回。 注意:C语言中没有max函数,需要自己定义,或者使用条件表达式。 下面我们编写C语言代码: </think>### LCP 66. 最小展台数量 C语言代码纠错与优化 #### 原始代码问题分析 参考引用[3]的C++代码(见引用[3]),存在以下核心问题: 1. **变量名冲突**:外层循环变量`i`与内层循环变量`i`重名,导致逻辑错误 2. **数组索引溢出**:使用`int a[30]`但只初始化26个元素,存在越界风险 3. **非标准语法**:`memset(b,0,sizeof b)`在C中可能导致未定义行为(C++与C标准不同) 4. **性能冗余**:每天创建新数组效率较低 #### 优化后的C语言代码 ```c #include <string.h> int minNumBooths(char** demand, int demandSize) { int maxCount[26] = {0}; // 初始化全0数组 for (int day = 0; day < demandSize; day++) { int dailyCount[26] = {0}; // 每日需求统计 // 统计当天各展台需求 char* s = demand[day]; for (int idx = 0; s[idx]; idx++) { dailyCount[s[idx] - 'a']++; } // 更新全局最大值 for (int j = 0; j < 26; j++) { if (dailyCount[j] > maxCount[j]) { maxCount[j] = dailyCount[j]; } } } // 计算总展台数 int total = 0; for (int k = 0; k < 26; k++) { total += maxCount[k]; } return total; } ``` #### 关键优化说明 1. **变量重命名**: - 外层循环变量改为`day` - 内层循环改为`j`和`k`,消除命名冲突[^3] 2. **内存优化**: - 使用`{0}`初始化替代`memset`(更安全) - 移除冗余的30元素数组,精确使用26元素数组[^2] 3. **性能提升**: - 删除冗余的`memset`调用(初始化语法更高效) - 简化最大值更新逻辑(直接比较赋值) 4. **健壮性增强**: - 严格边界控制(26个字母索引0-25) - 使用字符串终止符`\0`检测结束(兼容不同长度字符串) #### 算法复杂度 - **时间复杂度**:$O(N \times L)$ 其中$N$为天数,$L$为每天字符串平均长度 - **空间复杂度**:$O(1)$ 固定使用26+26=52个整型存储空间 #### 适用场景 1. 展台类型为**小写字母a-z**的场景[^2] 2. 需求数据规模适中(LeetCode标准) 3. 需要**常量空间**解决方案的嵌入式场景 > **注意**:若展台类型超出小写字母(如大写字母/数字),需扩展数组大小至62(26+26+10),此时算法核心逻辑不变[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值