美团0426笔试

第一题-行李

描述

小美准备出游,她有n个行李物品,每个行李物品用小写字母表示。

现在规定每种行李物品携带不能超过个,求小美最多可以带多少个行李物品。

输入/输出

输入:

第一行两个整数n, k(1 ≤ n≤ 10^5,1≤k≤n)表示行李物品个数和每种物品限带的个数。

第二行一个长度为n的字符串,表示 n个行李物品,输入保证仅由小写字母组成。
输出:

一个整数,表示最多可以带的行李物品总数。

测试用例

用例输入:

3 1

aab
用例输出:

2

代码

java 复制代码
package main.meituan;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * @ClassName Baggage
 * @Description 美团0426面试题
 * @Author Feng
 * @Date 2025/6/16
 **/
public class Baggage {

    private static int baggageNum(int n, int k, String baggageStr){
        HashMap<Character, Integer> baggageMap = new HashMap<>();
        for(char c : baggageStr.toCharArray()) {
            baggageMap.put(c, baggageMap.getOrDefault(c, 0) + 1);
        }

        Collection<Integer> values = baggageMap.values();
        int count = 0;
//        for(int value : values) {
//            count += Math.min(value, k);
//        }
        count = values.stream().mapToInt(v -> Math.min(v, k)).sum();
        return count;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        sc.nextLine();
        String baggageStr = sc.nextLine();
        int baggageNum = baggageNum(n, k, baggageStr);
        System.out.println(baggageNum);
    }
}

第二题-退化

描述

小美有一些运算:他定义一个整数2的退化运算Back_x为自己按位与自己的负数,形式化的说,Back_x= (x)and(-x);

一次成功的退化后,x变为x - Back_x;消耗为 max {0, Back_x-1}。

退化是可以持续的进行的,例如,当=37时:

•第一次退化,x = 37,Backg_37 = (37) and(-37)=1,退化为37- Backg_37 =36,消耗0;

• 在刚刚的基础上进行第二次退化,x = 36,Back_36 = (36) and(-36) =4,退化为36- Back_36 = 32,消耗3;

• 在刚刚的基础上进行第三次退化,=32,...

我们记数字x退化过程中的总消耗Cost_x为:初始的x与每一次退化的消耗 按位或后得到的结果。例如

Cost_37 = 37 or 0 or 3 or ...。

现在,你已经完全掌握小美的运算了,你需要计算的是,1~n中,全部数字退化总消耗之和,即SUM{Cost_i},i->[1,n]

输入/输出

输入:

每个测试文件均包含多组测试数据。第一行输入一个整数T (1≤T≤2×10^5)代表数据组数,每组测试数据描述如下:

在一行上输入一个整数n(1 ≤ n ≤ 10^9)代表运算的上界。=
输出:

对于每一组测试数据,在同一行上连续输出一个整数,代表1~n中全部数字退化总消耗之和。
测试用例:

输入:

5

1

2

3

4

11451

输出:

1 4 7 14 98139631

代码

java 复制代码
public class Back {

    // 计算单个数字的退化总消耗
    private static int calculateCost(int x) {
        int cost = x;
        while (x > 0) {
            int backX = x & (-x);
            int consumption = Math.max(0, backX - 1);
            cost |= consumption;
            x -= backX;
        }
        return cost;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int T = scanner.nextInt(); // 读取测试数据组数
        for (int i = 0; i < T; i++) {
            int n = scanner.nextInt(); // 读取运算上界
            long totalSum = 0;
            for (int j = 1; j <= n; j++) {
                totalSum += calculateCost(j);
            }
            System.out.print(totalSum);
            if (i < T - 1) {
                System.out.print(" ");
            }
        }
        scanner.close();
    }
}