📜  C测验– 106 |问题1(1)

📅  最后修改于: 2023-12-03 15:00:12.560000             🧑  作者: Mango

C测验– 106 |问题1

本题目要求程序员实现一个函数,该函数接受两个参数:一个整数数组和数组的长度,然后返回该数组中的第二小的元素。

函数原型
int find_second_minimum(int arr[], int len);
参数说明
  • arr[]:一个整数数组
  • len:数组的长度
返回值说明

该函数应返回数组中第二小的元素,如果找不到,则返回-1。

代码实现
int find_second_minimum(int arr[], int len)
{
    int i;
    int min, secondMin; 

    if (len < 2) {
        return -1; // 如果数组长度小于2,则无法找到第二小的元素
    }

    min = arr[0]; // 先将第一个元素默认为最小值
    secondMin = arr[1]; // 将第二个元素默认为第二小的元素

    if (secondMin < min) { // 如果第二小的元素小于最小值则交换两者的值
        int temp = min;
        min = secondMin;
        secondMin = temp;
    }

    // 从数组的第三个元素开始遍历
    for (i = 2; i < len; i++) { 
        if (arr[i] < min) { // 如果该元素小于最小值,则将该元素作为最小值并将secondMin的值更新为原min的值
            secondMin = min;
            min = arr[i];
        } else if (arr[i] < secondMin) { // 如果该元素大于最小值,但小于secondMin,则将该元素作为secondMin的值
            secondMin = arr[i];
        }
    }
    
    if (secondMin == min) { // 如果数组中只有一个元素,则无法找到第二小的元素
        return -1;
    }

    return secondMin;
}
使用示例
#include <stdio.h>

int main()
{
    int arr[] = {3, 6, 2, 8, 10};
    int len = sizeof(arr) / sizeof(arr[0]);

    int secondMin = find_second_minimum(arr, len);

    printf("数组中第二小的元素为:%d\n", secondMin);

    return 0;
}
思路说明

本题的解法比较简单,可以采用遍历数组的方式来找出第二小的元素。具体思路如下:

  1. 将第一个元素默认为最小值(min),将第二个元素默认为第二小的元素(secondMin)。
  2. 如果第二小的元素小于最小值,则交换两者的值。
  3. 从数组的第三个元素开始遍历,如果该元素小于最小值,则将该元素作为最小值并将secondMin的值更新为原min的值;如果该元素大于最小值,但小于secondMin,则将该元素作为secondMin的值。
  4. 返回secondMin的值。注意,需要判断数组中是否仅有一个元素的情况,如果是,则无法找到第二小的元素,应返回-1。