总结---2025美团---4.26笔试技术岗
一、行李
- 思路1:直接用哈希表统计每个字母出现的次数,取行李出现的次数与限制次数的最小值。
- 思路2:涉及到字母的哈希操作可以采用一个整数数组(长度为26)。
- 代码:
import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
// 输入
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int k = in.nextInt();
String s = in.next();
// 定义字符出现次数的数组并计算字符串出现次数
int[] cnt = new int[26];
for (char c: s.toCharArray()) {
cnt[c - 'a']++;
}
int ans = 0;
for (int num: cnt) {
ans += Math.min(num, k);
}
System.out.println(ans);
}
}
二、退化
- 技巧:
- x & (-x) 实际上获取的是数字二进制中最右侧的1。
- 多写几个例子发现,Cost值等于该数字最高有效位对应的全1数(例如,数字5的二进制最高位是4,对应的全1数为7)
- 思路:区间划分(在区间
内,Cost值相同为
),贡献计算(区间长度*Cost值)、累计求和
- 代码:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long t = in.nextInt();
for (long i = 0; i < t; i++) {
long n = in.nextInt();
long res = calSum(n);
System.out.print(res + " ");
}
}
private static long calSum(long n) {
long total = 0;
long k = 0;
while ((1 << k) <= n) {
long s = 1 << k;
long e = Math.min((1 << (k + 1)) - 1, n);
long cnt = e - s + 1;
total += cnt * ((1 << (k + 1)) - 1);
k++;
}
return total;
}
}
暑期笔试总结 文章被收录于专栏
记录一些公司的暑期笔试感悟
