核心思路:
(一)数组去重
移除所有重复出现的元素,使数组中每个数值只保留一个。
方法
双重循环 + 覆盖删除。
- 外层循环用 i 固定当前元素。
- 内层用 while 循环遍历 i 之后的所有元素。
- 如果发现 num[j] == num[i],说明 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,分情况讨论:
情况 1:len == 1
-
说明数组中所有元素值都相同(去重后只剩一个)。
-
没有第二大元素,直接输出提示并结束。
if (len == 1){
printf("数组中所有元素相同,无第二大元素");
return 0;
}
情况 2:len >= 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;
}
}

