首页 > 试题广场 >

买帽子

[编程题]买帽子
  • 热度指数:19088 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同。度度熊想买一顶价格第三便宜的帽子,问第三便宜的帽子价格是多少?

输入描述:
首先输入一个正整数N(N <= 50),接下来输入N个数表示每顶帽子的价格(价格均是正整数,且小于等于1000)


输出描述:
如果存在第三便宜的帽子,请输出这个价格是多少,否则输出-1
示例1

输入

10
10 10 10 10 20 20 30 30 40 40

输出

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

int main(){
	int N;
	while (cin>>N){
		vector<int> vec;
		while (N--){
			int a_i;
			cin>>a_i;
			vec.push_back(a_i);
		}
		sort (vec.begin(),vec.end());
		int result = vec[0];	
		int count = 0;
		vector<int> vec_1;
		vec_1.push_back(result);
		for (int i =1;i<vec.size();++i){
			if ( vec[i] != result ){ // 判去重
				vec_1.push_back(vec[i]);
				result = vec[i];
			}
		}
		if (vec_1.size() < 3){  // 没有第三便宜的帽子输出 -1
			cout << -1 <<endl;
		}
		else {      
			cout << vec_1[2] <<endl;
		}
	}
	return 0;
}

发表于 2017-09-06 15:32:42 回复(0)
    Scanner scanner = new Scanner(System.in);
    int count = scanner.nextInt();

    Scanner scanner2 = new Scanner(System.in);
    String s = scanner2.nextLine();

    String[] split = s.split(" ");
    if (split.length > count)
        System.out.println("输入数据错误");

    if (Arrays.stream(split).distinct().sorted().count() < 3)
        System.out.println("-1");
    else
        Arrays.stream(split).distinct().sorted()
                .skip(2).limit(1)
                .forEach(
                        a -> System.out.println(a)
                );
发表于 2017-04-28 11:49:47 回复(2)
=.=头像 =.=
import java.util.*;
public class Main{
    
    /*冒泡排序*/
    public static int[] sort(int[] money){
        for(int i=0; i<money.length-1; i++){
            for(int j=0; j<money.length-1-i; j++){
                if(money[j]>money[j+1]){
                    int temp = money[j];
                    money[j] = money[j+1];
                    money[j+1] = temp;
                }
            }
        }
        return money;
    }
    
    
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int count = sc.nextInt();
        int[] money = new int[count];
        //判断谁是第三个价格
        int level = 1;
        for(int i=0; i<count; i++){
            money[i] = sc.nextInt();
        }
        
        
        money = sort(money);
   
        
        for(int i=0; i<money.length-1; i++){
       
            if(money[i]<money[i+1]){
                level++;
            }
            
            if(level == 3){
                 System.out.println(money[i+1]);
                 break;
            }
        }
        
        if(level < 3){
             System.out.println("-1");
        }
        
       
      
    }
}

发表于 2017-05-08 15:15:27 回复(1)
#include <iostream>
using namespace std;
intmain(){
    inti,p,N,a[1001]={0};
    cin>>N;
    for(i=0;i<N;++i){
        cin>>p;
        ++a[p];
    }
    p=0;
    for(i=1;i<=1000;++i){
        if(a[i]>0)++p;
        if(p==3)break;
    }
    if(p==3)cout<<i;
    elsecout<<-1;
    cout<<endl;
    return0;
}

发表于 2017-04-28 13:29:38 回复(1)
策略:放到TreeSet中,就会自动排序,并且去除了重复的元素,取第三个即可
import java.util.Iterator;
import java.util.Scanner;
import java.util.TreeSet;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n =sc.nextInt();
TreeSet<Integer> tr = new TreeSet<>();
for (int i=0;i<n;i++){
tr.add(sc.nextInt());
}
Iterator<Integer> it = tr.iterator();
int i=0;
while(it.hasNext()){
i++;
if (i==3){
System.out.println(it.next());
break;
}
else {
it.next();
}
}
if (i!=3){
System.out.println(-1);
}
}
}
发表于 2017-04-28 12:45:56 回复(1)
importjava.util.Iterator;
importjava.util.Scanner;
importjava.util.TreeSet;
 
publicclassMain {
    publicstaticvoidmain(String[] args){
        Scanner in = newScanner(System.in);
        while(in.hasNext()){
            intn = Integer.valueOf(in.nextLine());
            int[] arr = newint[n];
            TreeSet<Integer> set = newTreeSet<>();
            for(inti = 0; i < n; i ++){
                arr[i] = in.nextInt();
            }
            in.nextLine();
            for(intj = 0; j < arr.length;j++){
                set.add(arr[j]);
            }
            Iterator<Integer> iterator = set.iterator();
            intcount = 0;
            if(set.size() >= 3){
                while(iterator.hasNext()){
                    count++;
                    iterator.next();
                    if(count == 2){
                        System.out.println(iterator.next());
                    }
                }
            }else{
                System.out.println(-1);
            }
             
        }
    }
}

发表于 2017-05-03 20:22:59 回复(0)
python不香么
while True:
    try:
        m = int(input())
        tmp = list(map(int,input().split(' ')))
        tmp2 = set(tmp)
        tmp3 = list(tmp2)
        tmp3.sort()
        if len(tmp3) >= 3:
            print(tmp3[2])
        else:
            print(-1)
    except:
        break

发表于 2021-08-26 12:40:51 回复(0)
看代码通俗易懂。
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scan= new Scanner(System.in);
        while(scan.hasNext()){
            int num=scan.nextInt();
            Set set=new TreeSet();
            for(int i=0;i<num;i++){
                set.add(scan.nextInt());
            }
            Iterator it=set.iterator();
            int index=-1;
            if(set.size()>=3){
                while(it.hasNext()){
                    index++;
                    if(index==2){
                        System.out.println(it.next());
                    }else{
                        it.next();
                    }
                }
            }else{
                System.out.println(-1);
            }
        }
    }

}


发表于 2020-03-18 14:17:52 回复(0)
//瞎写写,不知道怎么输出set中的第三个值?
#include <iostream>
#include <set>
using namespace std;
int main()
{
    int n;
    int i = 0,result;
    int price[50];
    cin >> n;
    while(n--)
        cin >> price[i++];
    set<int> s;
    for(int j =0;j<i;j++)
        s.insert(price[j]);
    if(s.size()<3)
    {
        result = -1;
    }
    else{
        set<int>::iterator it;
        int count = 0;
        for(it = s.begin();it!=s.end();it++)
        {
            if(count==2)
            {
                result = *it;
                break;
            }
            count++;
        }
    }
    cout << result << endl;
    return 0;
}

发表于 2019-09-16 20:49:14 回复(0)
#include<iostream>
#include <algorithm>
usingnamespacestd;
 
intmain()
{
    inta[50];
    intn = 0, m = 0;
    cin >> n;
    if(n == 1 || n == 2)
    {
        cout << -1 << endl;
        return0;
    }
    for(inti = 0; i < n; i++)
    {
        cin >> m;
        a[i] = m;
    }
    sort(a, a + n);
    int*sum=unique(a, a + n);
    if(sum <=a+2)
        cout << -1 << endl;
    else
        cout << a[2] << endl;
    return0;
}
发表于 2018-08-15 18:32:52 回复(0)
import sys
n=int(sys.stdin.readline().strip())
l1=list(map(int,sys.stdin.readline().strip().split()))
if n<3:
    print -1
else:
    l2=list(set(l1))
    l2.sort()
    length=len(l2)
    if length<3:
        print -1
    else:
        print l2[2]
发表于 2018-05-09 15:33:39 回复(0)
//已测试,通过所有用例!容易理解。
import java.util.Arrays;
import java.util.Scanner;

public class Main{
    public static void main(String []args){
         Scanner scanner = new Scanner(System.in);
         int N = scanner.nextInt();         //创建数量N,代表有N顶帽子;
         int num[] = new int[N];            //创建int数组,把所有帽子存进数组中;
         int count = 0;                     //用于计数;
         for(int i=0; i < N; i++){
             num[i] = scanner.nextInt();    //为数组赋值,对应每顶帽子的价格;
         }
         Arrays.sort(num);                  //进行从小到大排序;
         for(int j=1; j < N; j++){
             if(num[j-1] < num[j]){         //相邻的帽子价格进行比较;
                count++;
             }
             if(count == 3){                  
                System.out.println(num[j-1]);   //到达3时,输出结果;
                break;                          //退出循环;
              }
             if(count == 2 && num[N-2] <= num[N-1]){  //用于解决最大价格为第三便宜的情况;
                System.out.println(num[j]);           //输出结果;
                count++;                              //计数加1,防止count<3,输出-1;
                break;
             }
         }
         if(count < 3){                             //没有第三便宜的情况时,输出-1;
            System.out.println(-1);
         }
   }
}

发表于 2018-01-20 22:01:05 回复(0)
importjava.util.*;
publicclassMain{
    publicstaticvoidmain(String[] args) {
        //得到帽子价格数组
        Scanner sc =newScanner(System.in);
        intcount = sc.nextInt();
        Integer[] price =newInteger[count];
        for(inti =0; i < price.length; i++) {
            price[i] = sc.nextInt();
        }
      
        //把数组转化成 元素不重复的Set集合
        Set<Integer> set =newHashSet<>();
        for(inti =0; i < price.length; i++) {
            set.add(price[i]);
        }
    
        //把Set集合转化成数组然后排序
        Object[] price2 = set.toArray();
        Arrays.sort(price2);
        //如果存在价格第三的帽子,输出价格
        if(price2.length>=3){
            System.out.println(price2[2]);
        }
        else{
            System.out.println("-1");
        }
    }
}
发表于 2017-10-11 14:04:11 回复(0)

解题思路

  1. 输入数据总数n和数组a[n]
  2. 对a[n]进行升序排序
  3. 判断是否有第三大的数值,有则输出该数值,没有则输出-1
    通过对相邻两个数据项a[k]和a[k-1]数值是否相等进行判断,不相等则sum++;
    k=1,2…n-1;sum初始值为1;利用while循环实现

编程代码

import java.util.Scanner;
import java.util.Arrays;
/**
 * Created by Halley on 2017/9/2.
 */
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int[] a = new int[n];
            for (int i = 0; i < n; i++) {
                a[i] = sc.nextInt();
            }
            Arrays.sort(a);
            int k = 1;
            int sum = 1;
            boolean flag = true;
            while (k < n) {
                if (a[k] != a[k-1]) {
                    sum++;
                }
                if (sum == 3) {
                    flag = false;
                    System.out.println(a[k]);
                    break;
                }
                k++;
            }
            if (flag) {
                System.out.println(-1);
            }
        }
    }
}
编辑于 2017-09-02 12:48:59 回复(0)
import java.util.Arrays;
import java.util.Scanner;
public class Main {
    public static void main (String[] args) {
        Scanner sc = new Scanner(System.in);
        int num = sc.nextInt();
        int[] arr = new int[num];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = sc.nextInt();
        }
        int times = 0;
        Arrays.sort(arr);
        for (int j = 1; j < arr.length; j++) {
            if (arr[j] != arr[j - 1]) {
                times++;
            } else {
                continue;
            }
            if (times == 2) {
                System.out.print(arr[j]);
                return;
            }
        }
        System.out.print(-1);
    }
}
编辑于 2017-09-01 15:58:10 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        ArrayList<Integer> lsit = new ArrayList<Integer>();
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            arr[i] = sc.nextInt();
        }
        Set<Integer> set = new HashSet<Integer>();
        for(int i=0;i<arr.length;i++){
            set.add(arr[i]);
        }
        int x = -1;
        if(arr.length >= 3 && set.size() >= 3){
            Object[] arr1 = set.toArray();
            Arrays.sort(arr1);
            x = (int)arr1[2];
        }
        System.out.println(x);
    }
}

发表于 2017-07-19 11:29:01 回复(0)
#include<iostream>
#include<algorithm>
 
using namespace std; 
int main(){
    int n,tmp;
    cin>>n;
    vector<int> v;
    while(n--){
        cin>>tmp;
        v.push_back(tmp);
    }
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    cout<<(v.size()<3?-1:v[2]);
    return 0;
}
发表于 2017-07-10 18:21:01 回复(0)
/*
 *  使用了偷懒的方法,使用qsort函数进行价格的排序,然后筛选第三小的价格输出就OK
 */

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int compInc(const void *a, const void *b)  
{  
    return *(int *)a - *(int *)b;  
} 
int main(int argc, char **argv)
{
    int iNum;//表示帽子的数量
    int iPrice[64]; //存储价格的数组
    int i;
    int min = -1;
    int iFlag = 0; //表示第三小
    int iResult = 0; //结果存储在iResult里面
    while(scanf("%d",&iNum) != EOF)
    {
        if(iNum < 3)
        {
            iResult = -1;
        }
        for(i = 0; i < iNum;i++)
        {
            scanf("%d",&iPrice[i]);
        }
        qsort(iPrice, iNum, sizeof(iPrice[0]), compInc);
        for(i = 0; i < iNum; i++ )
        {
            if(min < iPrice[i])
            {
                min = iPrice[i];
                iFlag++;
                if(iFlag == 3)
                {
                    iResult = min;
                }
                if(iFlag < 3) 
                    iResult = -1;
            }
        }
        printf("%d",iResult);  
    }
    return 0;
}

发表于 2017-05-16 22:00:54 回复(0)


function findCap(num, Arr){
   var result = [];
   if(num < 3){ 
      console.log(-1)
    }else{
      result = Arr.sort(function(a, b){
         return a - b;
       })
      console.log(result[2]);
      }
   }
  findCap(1, 10)

编辑于 2018-04-13 00:10:44 回复(1)
直接使用set处理即可。

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

int main() {
	int n,temp;
	while (cin >> n) {
		set<int> res;
		for (int i = 0; i<n; i++) {
			cin >> temp;
			res.insert(temp);

		}
		//sort(res.begin(),res.end());
		if (res.size() >= 3) {
			set<int>::iterator it = res.begin();
			cout << *(++(++it)) << endl;
		}
		else {
			cout << -1 << endl;
		}

	}
	return 0;
}

发表于 2017-08-15 20:21:16 回复(0)