第一题-行李
描述
小美准备出游,她有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();
}
}