C语言:修复有序数组最长相同值序列查找函数问题
修复C函数以找出有序数组中最长连续相同值序列
原代码存在的问题
- 末尾序列未处理:如果最长连续序列出现在数组最后一段,循环内不会触发更新逻辑,导致结果错误。
- 序列长度重置错误:遇到不同元素时,
curr_max被设为0,正确应该重置为1(下一个元素本身是新序列的第一个)。 - 空数组越界:未处理
size=0的情况,会直接访问arr[0]导致内存越界。 - 逻辑遗漏:仅在当前序列比最大值长时才更新,但循环结束后没有检查最后一段序列的长度。
修复后的代码
int MaxSequence(const int arr[], int size, int* number) { // 处理空数组边界 if (size == 0) { *number = 0; // 可根据需求调整默认值 return 0; } int max_len = 1; int curr_len = 1; *number = arr[0]; for (int i = 0; i < size - 1; i++) { if (arr[i] == arr[i+1]) { curr_len++; } else { // 检查当前序列是否为更长序列 if (curr_len > max_len) { max_len = curr_len; *number = arr[i]; } // 重置当前序列长度为1(新序列的第一个元素) curr_len = 1; } } // 循环结束后检查最后一段序列 if (curr_len > max_len) { max_len = curr_len; *number = arr[size - 1]; } return max_len; }
关键修复说明
- 空数组处理:先判断数组是否为空,避免非法内存访问。
- 末尾序列检查:循环结束后额外判断最后一段连续序列的长度,确保不会遗漏最长序列。
- 长度重置修正:遇到不同元素时,将当前序列长度重置为1,符合新序列的起始逻辑。
- 可读性优化:变量名改为
max_len和curr_len,更直观表达含义。
测试验证
- 输入数组
{1,1,2,2,2,3}:返回长度3,number指向2(正确识别末尾的最长序列)。 - 输入数组
{5,5,5}:返回长度3,number指向5(修复原代码循环内无更新的问题)。 - 输入空数组:返回0,
number设为0(避免越界)。
内容的提问来源于stack exchange,提问作者Oren1996
相关产品推荐
相关产品推荐

