买帽子

(java实现)


题目描述:

度度熊想去商场买一顶帽子,商场里有N顶帽子,有些帽子的价格可能相同。度度熊想买一顶价格第三便宜的帽子,问第三便宜的帽子价格是多少?

输入描述:

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

输出描述:

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

示例1:

输入

10
10 10 10 10 20 20 30 30 40 40

输出

30


问题分析:

思路一:使用TreeSet实现;
思路二:使用ArrayList实现,但是只找倒数第三小,效率比较低。
思路三:使用下标的原理,若存在,则相应的价格设置为1;如输入的价格为price,则Array[price]=1。最后,通过求和,在求和得到“3”时进行输出。

注意:相同价格只算一个,故需要“去重”。

相关知识:

ArrayList list = new ArrayList();
list.sort(Comparator.naturalOrder()); //升序排序

TreeSet set = new TreeSet<>();
set.toArray()[2];


参考代码:

思路一实现:

import java.util.*;
public class Main {
        
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        TreeSet<Integer> set = new TreeSet<>();
        int index;
        for (int i=0; i<n; i++)
        {
            set.add(input.nextInt());
        }
        if (set.size()<3)
        {
            System.out.println(-1);
        }
        else
        {
            System.out.println(set.toArray()[2]);
        }
    }
}

思路二实现:

import java.util.*;
public class Main {
        
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        ArrayList<Integer> list = new ArrayList<Integer>();
        int index;
        for (int i=0; i<n; i++)
        {
            index = input.nextInt();
            if (!list.contains(index))
                list.add(index);
        }
        if (list.size()<3)
        {
            System.out.println(-1);
        }
        list.sort(Comparator.naturalOrder());
        for (int i=0; i<list.size(); i++)
        {
            if (2 == i)
            {
                System.out.println(list.get(i));
                break;
            }
        }
    }
}

思路三实现:

import java.util.*;
public class Main {
        
    public static void main(String[] args)
    {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int[] arr = new int[1001];
        int index;
        for (int i=0; i<n; i++)
        {
            index = input.nextInt();
            arr[index] = 1;
        }
        int count = 0;
        for (int i=0; i<1001; i++)
        {
            count += arr[i];
            if (count==3)
            {
                System.out.println(i);
                break;
            }
        }
        if (count<3)
        {
            System.out.println(-1);
        }
    }
}

相关知识:
List排序函数Collections.sort
1.Java提供的默认排序算法

List<Double> list = new ArrayList();
list.add(53.6);
list.add(45.9);
list.add(75.1);
list.add(89.3);
list.add(20.8);

//升序
Collections.sort(list);
System.out.println(list.toString());
输出结果:[20.8, 45.9, 53.6, 75.1, 89.3]

List<String> list = new ArrayList();
list.add("张三");
list.add("李四");
list.add("王二");
list.add("李明");

//升序
Collections.sort(list,Collator.getInstance(java.util.Locale.CHINA));//注意:是根据的汉字的拼音的字母排序的,而不是根据汉字一般的排序方法
System.out.println(list.toString());
输出结果:[李明, 李四, 王二, 杨洋, 张三]

2.重载排序算法

//根据map里某个key的value值进行升序排序
List<LinkedTreeMap<String, Object>> companys = new ArrayList<>();
LinkedTreeMap<String, Object> map1 = new LinkedTreeMap<>();
map1.put("name", "中国");
map1.put("percent", "12%");
map1.put("span", 2.34);
companys.add(map1);

LinkedTreeMap<String, Object> map2 = new LinkedTreeMap<>();
map2.put("name", "四川");
map2.put("percent", "11%");
map2.put("span", 1.34);
companys.add(map2);

LinkedTreeMap<String, Object> map3 = new LinkedTreeMap<>();
map3.put("name", "云南");
map3.put("percent", "10%");
map3.put("span", 2.08);
companys.add(map3);

//重载排序算法
Collections.sort(companys, new Comparator<LinkedTreeMap<String, Object>>() {
    @Override
    public int compare(LinkedTreeMap<String, Object> arg0,LinkedTreeMap<String, Object> arg1) {
        Double span1 = (Double) arg0.get("span");
        Double span2 = (Double) arg1.get("span");
        return span1.compareTo(span2);
    }
}); 
System.out.println(companys.toString());

输出结果:[{name=四川, percent=11%, span=1.34}, {name=云南, percent=10%, span=2.08}, {name=中国, percent=12%, span=2.34}]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值