【美团秋招】20230922小美的彩虹糖

小美的彩虹糖

小美有很多的彩虹糖,每颗彩虹糖都有一个颜色,她每天可以吃两颗彩虹糖,如果今天吃的彩虹糖组合是之前没吃过的组合,则小美今天会很高兴。
例如,小美有 6 颗彩虹糖,颜色分别是 [1,1,4,5,1,4]。

小红第一天吃一组颜色为 1 和 4 的彩虹糖,小美会很高兴;
第二天吃一组颜色为 4 和 1 的彩虹糖,小美不会很高兴;
第三天小美吃一组颜色为 1 和 5 的彩虹糖,小美会很高兴,此时小美共有 2 天很高兴。

小美想知道,她最多有几天会很高兴。

输入描述
第一行输入一个整数 n (1<=n<= 1 0 5 10^5 105)表示彩虹糖数量。
第二行输入 n 个整数表示彩虹糖颜色a (1<= a i a_i ai<= 1 0 9 10^9 109)。

输出描述
输出一个整数表示答案。

示例输入

6
1 1 4 5 1 4

输出

3

说明
第1天吃一组颜色为1,4的彩虹糖。
第2天吃一组颜色为4,5的彩虹糖。
第3天吃一组颜色为1,1的彩虹糖。
小美3天都会很高兴。

题解

(错误答案)
哈希表统计每个出现的次数。如果次数大于2的,先作子环(x,x),然后遍历map的key,试着去匹配,次数还有且还没匹配到最后一个,作++

import java.util.*;

public class Main {
    
    
    public static void main(String[] args) {
    
    
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        Map<Integer, Integer> map = new HashMap<>();

        for (int i = 0; i < n; i++) {
    
    
            int temp = in.nextInt();
            map.put(temp, map.getOrDefault(temp, 0) + 1);
        }
        //System.out.println(map);

        Object[] array = map.keySet().toArray();
        int count = 0;

        for (int i = 0; i < array.length; i++) {
    
    
            if (map.get(array[i]) >= 2) {
    
    
                map.put((Integer) array[i], map.get(array[i]) - 2);
                count++;
            }
        }
        //System.out.println(map);
        //System.out.println(count);

        for (int i = 0; i < array.length; i++) {
    
    
            for (int j = i + 1; j < array.length; j++) {
    
    
                if (map.get(array[i]) > 0 && map.get(array[j]) > 0) {
    
    
                    map.put((Integer) array[i], map.get(array[i]) - 1);
                    map.put((Integer) array[j], map.get(array[j]) - 1);
                    count++;
                    //System.out.println(map);
                }
            }
        }
        System.out.println(count);
    }
}
//22
//十个1,十个2,俩个3不对

感觉是正解

先按出现的次数从大排到小,取次数最大的,先判断能不能自环,再依次配对别人,然后取下一个。

import java.util.*;
import java.util.stream.Collectors;

public class test {
    
    
    public static void main(String[] args) {
    
    
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        Map<Integer, Integer> map = new HashMap<>();
        int count = 0;

        //得到 map
        for (int i = 0; i < n; i++) {
    
    
            int temp = in.nextInt();
            map.put(temp, map.getOrDefault(temp, 0) + 1);
        }
        //System.out.println(map);

        // 使用Stream API根据 Map的值进行排序
        List<Map.Entry<Integer, Integer>> sortedMapList = map.entrySet().stream()
                .sorted(Map.Entry.comparingByValue())
                .collect(Collectors.toList());

        int[] tempArray = new int[sortedMapList.size()];
        int a = 0;
        // 输出排序后的结果
        for (Map.Entry<Integer, Integer> entry : sortedMapList) {
    
    
            tempArray[a] = entry.getKey();
            a++;
        }
        /*for (int j:tempArray) {
            System.out.print(j+" ");
        }
        System.out.println();*/

        for (int i = tempArray.length-1; i >=0 ; i--) {
    
    
            //先匹配自己
            if(map.get(tempArray[i]) >= 2){
    
    
                map.put(tempArray[i], map.get(tempArray[i]) - 2);
                count++;
            }
            //再匹别人
            for (int j = i-1; j >=0 ; j--) {
    
    
                //自己大于0,且想匹配的数也大于0
                if (map.get(tempArray[i]) > 0 && map.get(tempArray[j]) > 0) {
    
    
                    map.put(tempArray[i], map.get(tempArray[i]) - 1);
                    map.put(tempArray[j], map.get(tempArray[j]) - 1);
                    count++;
                }
            }
        }
        System.out.println(count);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44033208/article/details/132645506