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

C语言实现数组零替换为右侧最小奇数的代码问题排查

问题描述

编写一个函数处理给定的非负整数数组,将数组中每个零值替换为该零右侧的最小奇数值;若零右侧无奇数则保留零值不变。

现有代码错误排查
  • 传参错误:调用lowestOdd和printArray时传入的是myarr[20],这是数组下标为20的单个int元素(本身已经数组越界),不是数组首地址,直接传数组名myarr即可,这也是触发warning: passing argument 1 of 'lowestOdd' makes pointer from integer without a cast [-Wint-conversion]警告的直接原因。
  • 逻辑错误:lowestOdd函数原有遍历逻辑不符合需求,没有针对每个零值单独查找其右侧的最小奇数,试图用单个temp变量存储全局最小值,逻辑方向完全错误。
  • 语法错误:判断零值的语句写为if (num[i] = 0),这是赋值操作而非相等判断,正确写法为==;printf中的换行符错写为/n,正确转义字符为\n。
  • 边界问题:原遍历逻辑访问num[i+1]时没有判断i是否到达数组末尾,会触发越界访问;temp变量未初始化,遇到零右侧无奇数的场景会出现未定义行为。
  • 认知误区:该功能不需要显式编写复杂指针操作,C语言中数组传参本身会隐式退化为首元素指针,直接通过数组下标访问就可以修改原数组内容。
正确实现代码
#include <stdio.h>

void lowestOdd(int num[], int size) {
    int i, j;
    for (i = 0; i < size; i++) {
        // 仅处理值为0的元素
        if (num[i] == 0) {
            int min_odd = -1; // -1标记右侧未找到奇数,适配非负数组的取值范围
            // 遍历当前零右侧的所有元素
            for (j = i + 1; j < size; j++) {
                if (num[j] % 2 != 0) {
                    // 首次遇到奇数、或当前奇数比已记录的最小值更小则更新
                    if (min_odd == -1 || num[j] < min_odd) {
                        min_odd = num[j];
                    }
                }
            }
            // 找到最小奇数则替换,否则保留原零值
            if (min_odd != -1) {
                num[i] = min_odd;
            }
        }
    }
}

void printArray(int array[], int size) {
    int i;
    for (i = 0; i < size; i++) {
        printf("%d\n", array[i]);
    }
}

int main() {
    int i, size;
    int myarr[20];
    printf("What is the size of your array? \n");
    scanf("%d", &size);
    // 增加输入合法性校验,避免数组越界
    if (size < 1 || size > 20) {
        printf("Invalid array size!\n");
        return 1;
    }

    for (i = 0; i < size; i++) {
        scanf("%d", &myarr[i]);
    }
    lowestOdd(myarr, size);
    printArray(myarr, size);
    return 0;
}
实现说明
  • 采用双重遍历逻辑:外层循环遍历数组定位所有零值,内层循环遍历每个零值的右侧区间查找最小奇数,时间复杂度为O(n²),适配题目给定的最大数组长度20的场景,性能完全足够。
  • 利用题目给定的「非负整数数组」条件,用min_odd = -1作为未找到奇数的标记,避免了未初始化变量的问题。
  • 数组传参直接传入数组名即可,函数内对数组元素的修改会直接作用于原数组,不需要额外手动定义指针变量。

内容的提问来源于stack exchange,提问作者emcosokic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:42:15