第二统计数字(求第二小的数字)

鲍勃要找出一个整数序列中的第二统计数字。我们从序列中将每个数字选取出来进行从小到大排序(每个数字只使用一次),排第二的数值就是第二统计数字。换句话说,第二统计数字就是序列中除去最小值数字以外的最小值。请你帮助鲍勃解决这个问题。

输入输出说明:

输入的第一行是整数n(1 ≤ n ≤ 100),即序列中整数的个数 第二行是整数序列a1,a2,...,an(-100 ≤ ai ≤ 100)
如果序列含有第二统计数字,则输出这个整数;否则,输出NO。
测试集1;4
2 5 1 4
测试集2:5
1 3 5 4 2
测试集3:2
1 1
输出 NO

#include <iostream>
using namespace std;

int main()
{
int n,temp;
cin>>n;
int arr[n];
if(n==1) cout<<"NO";
if(n>1) {for(int i=0;i<n;i++)
 {cin>>arr[i];}
 for (int i=1;i<n;++i) {
     bool flag=false;
      for(int j=0;j<n-i;++j){
          if(arr[j]>arr[j+1]){ 
          temp=arr[j];
          arr[j]=arr[j+1];
          arr[j+1]=temp;
          flag=true;}
          if(flag==false)  break;
      }
 }
int j;
for (j=1;j<n;j++){
     if(arr[j]!=arr[0]) {cout<<arr[j];break;
 }
if(j==n) cout<<"NO";
/*********end*********/
}
}
}

######我写的代码然后过不了不知道哪错了,望大佬教我,救救孩子。

int arr[n]; 你这句话有问题。不能这么赋值。使用指针创建动态内存
更改为如下代码:

int n, temp;
    cin >> n;
    int *arr=new int[n];
    if (n == 1) cout << "NO";
    if (n > 1) {
        for (int i = 0; i < n; i++)
        {
            cin >> arr[i];
        }
        for (int i = 1; i < n; ++i) {
            bool flag = false;
            for (int j = 0; j < n - i; ++j) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag = true;
                }
                if (flag == false)  break;
            }
        }
        int j;
        for (j = 1; j < n; j++) {
            if (arr[j] != arr[0]) {
                cout << arr[j]; break;
            }
            if (j == n) cout << "NO";
        }
    }
    delete[] arr;

img

遍历一遍就行了,记录最小的两个不同的数,没必要排序。

#include <iostream>
#include <climits>

int main()
{
    const int N = 100;
    int n;
    int a[N];
    std::cin >> n;
    for (int i = 0; i < n; i++)
        std::cin >> a[i];
    int min[2] = {INT_MAX, INT_MAX};
    for (int i = 0; i < n; i++)
    {
        if (a[i] < min[0])
        {
            min[1] = min[0];
            min[0] = a[i];
        }
        else if (a[i] < min[1] && a[i] != min[0])
        {
            min[1] = a[i];
        }
    }
    if (min[1] == INT_MAX)
        std::cout << "NO";
    else
        std::cout << min[1];
    return 0;
}
if(j==n) cout<<"NO";

这句放在循环外面,否则判断完后j=n循环结束,不会输出NO

#include <iostream>
using namespace std;

int main()
{
    int n,temp;
    cin>>n;
    int arr[n];
    if(n==1) cout<<"NO";
    if(n>1)
    {
        for(int i=0; i<n; i++)
        {
            cin>>arr[i];
        }
        for (int i=1; i<n; ++i) {
            bool flag=false;
            for(int j=0; j<n-i; ++j)
            {
                if(arr[j]>arr[j+1])
                {
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                    flag=true;
                }
                if(flag==false)  break;
            }
        }
        int j;
        for (j=1; j<n; j++)
        {
            if(arr[j]!=arr[0])
            {
                cout<<arr[j];
                break;
            }
        }
        if(j==n) cout<<"NO";
    }
}