公司动态
C语言之求数组中第二大元素的值
核心思路一数组去重移除所有重复出现的元素使数组中每个数值只保留一个。方法双重循环 覆盖删除。外层循环用i固定当前元素。内层用while循环遍历i之后的所有元素。如果发现num[j] num[i]说明j位置是重复元素将j后面的所有元素前移一位覆盖num[j]。数组有效长度len减 1。j不增加因为新的元素移到了j位置需要重新检查。if (num[i] num[j]){ // 删除 num[j] for (int k j; k len - 1; k){ num[k] num[k 1]; } len--; // 缩短长度 // j不增加继续检查当前位置 }如果不相等则j继续检查下一个位置。else{ j; // 只有不相等时才移动 j }关键点删除元素后j要回退确保不会漏掉因前移而进入j位置的新元素。二处理去重后的数组根据去重后的数组长度len分情况讨论情况 1len 1说明数组中所有元素值都相同去重后只剩一个。没有第二大元素直接输出提示并结束。if (len 1){ printf(数组中所有元素相同无第二大元素); return 0; }情况 2len 2初始化最大值和次大值比较num[0]和num[1]较大的赋给max较小的赋给secondMax。这样初始化的好处是如果数组只有两个元素它们就是最终结果无需进入循环。if (num[0] num[1]) { max num[0]; secondMax num[1]; } else { max num[1]; secondMax num[0]; }遍历剩余元素从i 2开始如果num[i] max说明发现了新的最大值原来的max降级为secondMax更新max num[i]。否则如果num[i] secondMax说明当前元素比次大值大但小于最大值直接更新secondMax。注意这里不需要考虑num[i] max的情况因为去重后已保证所有元素值不重复。for (int i 2; i len; i) { if (num[i] max){ // 新最大值旧最大值降级为次大 secondMax max; max num[i]; } else if (num[i] secondMax){ // 比次大大直接更新次大 secondMax num[i]; } }完整代码如下#include stdio.h int main() { int num[8]; int len sizeof(num) / sizeof(num[0]); int max, secondMax; // 1.输入数组 printf(请输入%d个元素:, len); for (int i 0; i len; i){ scanf(%d, num[i]); } // 2.数组去重 for (int i 0; i len - 1; i){ int j i 1; while (j len){ if (num[i] num[j]){ // 删除 num[j] for (int k j; k len - 1; k){ num[k] num[k 1]; } len--; // 缩短长度 // j不增加继续检查当前位置 } else{ j; // 只有不相等时才移动 j } } } printf(去重后长度len%d\n, len); // 3.根据去重后元素个数分开求解 // 如果去重后只有一个元素 if (len 1){ printf(数组中所有元素相同无第二大元素); return 0; } // 去重后有2个及以上 else{ // 先初始化防止两个变量都是最大值 // 如果去重后只有2个元素则下面初始化为最后结果 if (num[0] num[1]) { max num[0]; secondMax num[1]; } else { max num[1]; secondMax num[0]; } // 如果有2个则不满足for循环条件不执行下面循环上面初始化为最后结果 // 如果是2个以上则执行循环更新最大和次大值 for (int i 2; i len; i) { if (num[i] max){ // 新最大值旧最大值降级为次大 secondMax max; max num[i]; } else if (num[i] secondMax){ // 比次大大直接更新次大 secondMax num[i]; } } printf(该数组中第二大元素%d\n, secondMax); return 0; } }