百度测试笔试
笔试时间:2023-04-10:19:00~21:00
笔试地点:赛码网
现在提前做完了,胶卷了,30道选择题60分,2道算法题40分。选择题乱选了,不会测试题,有些问SVM算法等等。
下面写一下算法题吧:
问题一
/**
* @author xin麒
* @date 2023/4/10 19:43
编程题|20.0分1/2
最佳优惠
时间限制: 3000MS
内存限制: 589824KB
题目描述:
现在给你一张优惠券。优惠券上有两个正整数L和R。
该优惠券的使用规则是: 你可以任意选取一个位于[L, R]之间的正整数(不妨令其为x),抵扣 x 和 x 各个数位上的数字之和的乘积的金额。
比如当你选择数字69时,你可以抵扣的金额为
69 * (6 + 9) = 1035
现在询问你最大可以利用手中这张优惠券抵扣多少金额?
输入描述 一行,给出两个整数 L, R以空格隔开,代表手中优惠券上的数。
1 ≤ L ≤ R ≤ 1e5
输出描述
输出一行,代表最大优惠金额。
样例输入
3 6
样例输出
36
提示
样例解释1
选取数字为 3 的折扣金额是3*3=9,数字为 4 的折扣金额是4*4=16,数字为 5 的折扣金额是5*5=25,数字为 6 的折扣金额是6*6=36,故最大折扣金额为36。
输入样例2
11 31
输出样例2
319
样例解释2 选取数字为 29 的折扣金额是29 * (2+9)=319,可以证明这是手上优惠金额最大的一张优惠券。
*/
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] split = scanner.nextLine().split(" ");
int L = Integer.parseInt(split[0]);
int R = Integer.parseInt(split[1]);
int myRes = 0;
for (int i = L; i <= R ; i++) {
myRes = Math.max(myRes,getRes(i));
}
System.out.println(myRes);
}
private static int getRes(int myRes) {
String s = myRes + "";
int count = 0;
for (int i = 0; i < s.length(); i++) {
String tmp = s.charAt(i) + "";
count += Integer.parseInt(tmp);
}
return myRes * count;
}
}
问题2:
/**
* @author xin麒
* @date 2023/4/10 19:56
相差为k的数对数量
时间限制: 3000MS
内存限制: 589824KB
题目描述:
给出一个长度为n的数组,统计其中差值为k的数对的数量。
其中,数对的定义是,从数组中选择两个位置不同的数字,即可组成一个数对。
1 <= n, k <= 100000,数组中每个数字的范围在[1, 200000]之间
输入描述
第一行两个正整数n和k,表示数组长度为n,询问的差值为k。
接下来一行n个正整数,表示数组中每个数的大小。
输出描述
一行,一个非负整数,表示相差为k的数对的数量。
样例输入
6 5
5 6 7 8 9 10
样例输出
1
提示
样例解释1
这个例子中,仅有一组数对差值为5,即(5,10)
输入样例2
6 5
5 5 5 10 10 10
输出样例2
9
样例解释2
不同位置上的(5, 10) 共有9对
*/
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String[] split = scanner.nextLine().split(" ");
int size = Integer.parseInt(split[0]);
int k = Integer.parseInt(split[1]);
String[] s = scanner.nextLine().split(" ");
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < s.length; i++) {
int num = Integer.parseInt(s[i]);
Integer integer = map.get(num);
if (integer == null){
map.put(num,1);
}else {
map.put(num,integer + 1);
}
}
int myRes = 0;
for (Integer integer : map.keySet()) {
Integer num = map.get(k + integer);
if (num == null || num == 0) continue;
Integer size1 = map.get(integer);
myRes += size1 * num;
}
System.out.println(myRes);
}
}
/*
样例输入
6 5
5 6 7 8 9 10
样例输出
1
输入样例2
6 5
5 5 5 10 10 10
输出样例2
9
*/
两道都显示AK了不知道是真还是假。就这样吧,无所谓了,该挂双飞还是挂。
本文介绍了百度在线笔试中的两道算法题,分别是寻找[L,R]区间内能获得最大优惠的数及计算差值为k的数对数量。第一题通过遍历区间内的数并计算其数字和的乘积,第二题利用HashMap统计数组中差值为k的数对。
2758

被折叠的 条评论
为什么被折叠?



