C语言数组行最大值左侧元素替换问题求助
问题分析
你的代码会把所有元素替换成最大值,核心问题是没有区分元素是否在最大值的左侧——第二个循环里只要元素小于最大值就替换,完全忽略了位置要求。另外那个while循环完全没必要,这里用直接赋值就行,因为替换一次就够了。
修正思路
要实现只替换最大值左侧的元素,你需要:
- 不仅记录每行的最大值,还要记录最大值所在的列索引
- 只对该列索引之前的元素进行替换操作,最大值本身和右侧元素保持原样
修正后的代码
// 假设R是行数,C是列数,A是目标二维数组 int MAX[R], max_col[R]; // 第一步:遍历每行,找出最大值及其所在列 for(int i = 0; i < R; i++) { MAX[i] = A[i][0]; // 初始化为该行第一个元素,避免数组全为负数时出错 max_col[i] = 0; for(int j = 1; j < C; j++) { if(A[i][j] > MAX[i]) { MAX[i] = A[i][j]; max_col[i] = j; // 记录最大值的列位置 } } } // 第二步:替换每行最大值左侧的元素 for(int i = 0; i < R; i++) { // 只遍历到最大值所在列的前一列 for(int j = 0; j < max_col[i]; j++) { A[i][j] = MAX[i]; } }
关键细节说明
- 初始化最大值时,别直接设为0,改用该行第一个元素,否则如果数组里全是负数,初始的0会比所有元素都大,导致找错最大值。
max_col数组用来记录每行最大值的位置,列索引小于max_col[i]的元素就是最大值左侧的目标元素。- 第二个循环只遍历到
max_col[i]之前,最大值本身和右边的元素不会被修改,完全符合需求。
内容的提问来源于stack exchange,提问作者JELO
相关产品推荐
相关产品推荐

