首页 > 试题广场 >

第二大的数

[编程题]第二大的数
  • 热度指数:1182 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 128M,其他语言256M
  • 算法知识视频讲解
输入n个整数,查找数组中第二大的数

输入描述:
第一行n表示n个数,第二行n个空格隔开的数


输出描述:
输出第二大的数
示例1

输入

5 1 2 3 4 5

输出

4
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[1000000],n,i;
int main(){
    for(scanf("%d",&n),i=0;i<n;i++) scanf("%d",a+i);
    nth_element(a,a+n-2,a+n),printf("%d\n",a[n-2]);
}

发表于 2017-11-25 19:24:00 回复(0)
#include<bits/stdc++.h>
using namespace std;

int  main()
{
    int n;
    vector<int > v;
    while(cin>>n)
    {       
        v.clear();
        
        int t;
        
        for(int i=0;i<n;i++)
        {
            cin>>t;
            v.push_back(t);
            t=0;
        }
        
        nth_element(v.begin(),v.begin()+1,v.end(),greater<int>());       
        cout<<v[1]<<endl;
    }
    return 0;


}

发表于 2020-03-28 22:49:23 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int count = in.nextInt();
        int temp=0;
        int themax=Integer.MIN_VALUE;int themax2=Integer.MIN_VALUE;
        for(int i = 0;i < count;i++){
            //if(in.hasNext()){
                temp=in.nextInt();
                if (themax2<temp){
                    if (themax<temp){
                        themax2=themax;
                        themax=temp;
                    }else {
                        themax2=temp;
                    }
                }
            //}
        }
        System.out.print(themax2);
    }
}
这个代码哪里错了?case通过80%.为社么去掉注释的两句后就能全部通过
编辑于 2019-07-24 17:25:42 回复(1)
利用set存储输入的数据, 去重并排序, 输出set倒数第2个数
#include <iostream>
#include <vector>
#include <algorithm>
#include <set>

using namespace std;
int main()
{
	int n;
	set<int> set;

	cin >> n;
	int temp;
	for (int i = 0; i < n; i++)
	{
		cin >> temp;
		set.insert(temp);
	}
	if (set.size() >= 2) { cout << *(++set.rbegin()) << endl; }
        else { cout << *set.begin() << endl; }    // 所有数相同       

	system("pause");
	return 0;
}


编辑于 2023-03-03 10:40:27 回复(0)
#include <bits/stdc++.h>
using namespace std;
int partation(int nums[], int lo, int hi) {
    if(lo == hi) return lo;
    int pivot = nums[lo];
    while(lo < hi) {
        while(lo < hi && nums[hi] >= pivot) hi--;
        if(lo < hi) nums[lo] = nums[hi];
        while(lo < hi && nums[lo] <= pivot) lo++;
        if(lo < hi) nums[hi] = nums[lo];
    }
    nums[lo] = pivot;
    return lo;
}

int main()
{
    int n;
    cin >> n;
    int nums[n];
    memset(nums, 0, sizeof(nums));
    for(int i = 0; i < n; ++i) {
        cin >> nums[i];
    }
    int lo = 0, hi = n - 1;
    while(lo < hi) {    //利用快排的思想
        int idx = partation(nums, lo, hi);
        if(idx == n - 2) {
            cout << nums[idx] << endl;
            break;
        }
        else if(idx > n - 2) hi = idx - 1;//这里不能原地更新hi = idx如果有重复的数就不动了
        else lo = idx + 1;
    }
    return 0;
}

发表于 2020-05-08 14:06:25 回复(0)
用例真的没问题吗?为啥就是会有20%通不过呢?
发表于 2020-04-08 21:47:31 回复(0)
n=int(input())
m=input().split()
print(sorted(m)[-2])

发表于 2020-03-20 23:29:34 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(){
        Scanner scaner = new Scanner(System.in);
        int number = scaner.nextInt();
        int[] source = new int[number];
        for(int i = 0 ; i < number ; i++){
            source[i] = scaner.nextInt();
        }
        System.out.print(findSecond(source));
    }
    
    public static Integer findSecond(int[] source){
        if(null == source || source.length <= 1){
            return null ;
        }
        int max = source[0];
        int second = source[0];
        for(int number : source){
            if(number > max){
                if(max > second){
                    second = max ;
                }
                max = number ;
            }else {
                if(number > second){
                    second = number;
                }
            }
        }
        if(max > second){
            return second ;
        }
        return null ;
    }  
}

时间复杂度O(n),为什么不给过呀
发表于 2019-12-23 15:23:16 回复(0)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Newtonsoft.Json;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        { 
            Random n = new Random();
            Console.WriteLine(n.Next(1,12));
       string[] strNew = Console.ReadLine().Split(' ') ; 
            int[] a = new int[strNew.Length];  
            for (int i = 0; i < a.Length; i++)
            {
                a[i] = Convert.ToInt32(strNew[i]);
                for (int j = 0; j < i; j++)
                {
                    int temp = 0;
                    if (a[i] < a[j])
                    {
                        temp = a[i];
                        a[i] = a[j];
                        a[j] = temp;
                    }
                }
            } 
            Console.WriteLine(a[a.Length-2]);
            Console.ReadKey(); 
        }
    } 
}

发表于 2019-11-04 16:52:35 回复(0)

简单的题目,问题是测试用例有一些特殊,题目给出N个数,可是第二行可能输入不标准,给出不足N个数字,如 12
2 3 5 6 8 ,输出应该是6,但是由于不足12个数字,会一直从缓冲区读8,读入就是 2 3 5 6 8 8 8 8 8···,所以结果会输出8,所以每次操作最后清零,缓冲区读入就是0,不影响了,(因为存在负数,最好是将缓冲区数字置为最小值,本题测试用例过去了,我就不改了)。
代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int n ,a = 0;
    vector<int> arr;
    cin>>n;
    for(int i = 0; i < n; i++)
    {
        cin>>a;

        arr.push_back(a);
         a = 0;
    }
    sort(arr.begin(),arr.end());

    cout<<arr[arr.size()-2];
    return 0;
}
发表于 2019-09-16 10:23:27 回复(0)
只有80%,但是剩下的20%,算是找到原因了
#include <iostream>
#include <vector>
using namespace std;
int divide(vector<int> &nums,int left,int right)
{
    int temp=nums[left];
    do
    {
        while(left<right&&nums[right]>=temp)
            right--;
        if(left<right)
        {
            nums[left]=nums[right];
            left++;
        }
        while(left<right&&nums[left]<=temp)
            left++;
        if(left<right)
        {
            nums[right]=nums[left];
            right--;
        }
    }
    while(left!=right);
    nums[left]=temp;
    return left;//这里如果是return temp,正确率20%,搞不懂
}
int main()
{
    int numbers,num;
    cin>>numbers;
    vector<int> nums(numbers);
    for(int i=0;i<numbers;i++)
    {
        cin>>num;
        nums[i]=num;
    }
    int left=0,right=numbers-1;
    int pos=divide(nums,left,right);
    while(pos!=numbers-2)
    {
        if(pos<numbers-2)
        {
            left=pos+1;
            pos=divide(nums,left,right);
        }
        else
        {
            right=pos-1;
            pos=divide(nums,left,right);
        }
    }
    cout<<nums[pos];
    return 0;
}

发表于 2019-08-25 10:02:00 回复(0)
这个测试用例有问题吧
发表于 2019-08-22 10:32:25 回复(0)
????
错误用例
12
5 4 3 6 7
说好输入12个 结果给我5个?????
这能算是异常输入?这不是题目描述异常???
这还真是5个数。。那还要N干嘛? 我直接从第二行判断if(cin>>t)算了
编辑于 2019-08-17 14:29:51 回复(0)
import java.util.Arrays;
import java.util.Scanner;

public class Main {
    public static int secBigest(int [] array) {
        if(array == null || array.length <= 1)
            return 0;
        Arrays.sort(array);
        int len = array.length;
        return array[len-2];
    }
    public static void main (String [] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        int []a = new int[n];
        for(int i=0; i<n; i++){
            a[i] = scan.nextInt();
        }
        System.out.println(secBigest(a));
    }
}

这个为啥是百分之八十啊???
发表于 2019-08-15 15:54:46 回复(1)
#include<bits/stdc++.h>
#define frp(i,a,b) for(int i = a; i <= b; i++)
 
usingnamespacestd;
 
intn,a[100010];
 
inlinevoidget_ready( )
{
    scanf("%d", &n);
}
 
inlinevoidsolve(){
    frp(i,1,n)  scanf("%d", &a[i]);
    intmx,ans;
    frp(i,1,n){
        if(a[i]>=ans && a[i]<mx){
            ans = a[i];
        }
        elseif(a[i]>=ans){
            ans = mx;
            mx = a[i];
        }
    }
    printf("%d\n",ans);
}
 
intmain( )
{
    get_ready( );
    solve( );
    return0;
}

发表于 2017-11-25 22:23:21 回复(0)