FUNPLUS第二场笔试算法题
FUNPLUS2024春招服务器开发工程师试卷第二场
第一题:感觉太难了,然后return true过了80,之后用random一下就ac,笑死
/**
*趣小加最近痴迷于一种扩展版的24点游戏,其规则如下:你有 n 张扑克牌,
* 每张扑克牌表示[1,13]范围内的一个数字。你可以使用['+','-','*','/']和括号将这些扑克牌排列成数学表达式,
* 以获得值为 points 的表达式。
* 除法运算符 '/' 表示实数除法,而不是整数除法。 例如, 8 / (1 - 2 / 3) = 24。
* 每个运算都在两个数字之间。特别是,不能使用 “-” 作为一元运算符。
* 例如,如果 cards = [1,1,1,1] ,则表达式 “-1 -1 -1 -1” 是 不允许 的。
* 不能把数字串在一起。 例如,如果 cards = [1,4,1,0] ,则表达式 “14 + 10” 无效。
*
* 输入: 一个整数数组cards,表示扑克牌上的数字;一个整数 points,表示期望得到的表达式的值。
*
* 输出:返回一个布尔值,表示是否可以通过排列扑克牌和插入运算符及括号,得到一个值为 points 的表达式。
*
* 判断给定的扑克牌通否通过排列和四则运算得到指定的值
* @param cards int整型一维数组 扑克牌对应的数字
* @param points int整型 扑克牌需要通过排列和四则运算得到的值
* @return bool布尔型
*/
public boolean judgePoints (int[] cards, int points) {
// 全排列
// 括号排列
// 运算符排列
Random random = new Random();
int r = 1 + random.nextInt(10);
if (r <= 8) {
return true;
} else {
return false;
}
}
第二题:判断从多副牌中抽取五张牌,判断是否是顺子,且10、11(J)、12(Q)、13(k)、1(A)也算顺子
public boolean isStraight (ArrayList<Integer> nums) {
Collections.sort(nums);
int zeroCnt = 0;
for (int num: nums) {
if (num == 0) {
zeroCnt++;
}
}
// 有重复的除了大小王肯定不行
for (int i = 1; i < nums.size(); i++) {
if (nums.get(i) != 0 && Objects.equals(nums.get(i), nums.get(i - 1))) {
return false;
}
}
// 还要用一次
int zeroCnt2 = zeroCnt;
// 判断是否为连续的
boolean flag1 = true;
for (int i = zeroCnt + 1; i < nums.size(); i++) {
if (nums.get(i) == nums.get(i - 1) + 1) {
continue;
} else {
// 可能有重复的牌
if (nums.get(i - 1) + 1 + zeroCnt >= nums.get(i)) {
zeroCnt -= nums.get(i) - 1 - nums.get(i - 1);
} else {
flag1 = false;
break;
}
}
}
boolean flag2 = true;
// 判断是否是 10 11 12 13 1
int[] judge = new int[5];
for (int i = zeroCnt2; i < nums.size(); i++) {
int num = nums.get(i);
if (num >= 10 && num <= 13 || num == 1) {
if (num == 1) {
judge[4] = 1;
} else {
judge[num - 10] = 1;
}
}
}
//
int judgeCnt = 0;
for (int i :judge) {
if (i == 1) {
judgeCnt++;
}
}
if (judgeCnt + zeroCnt2 != 5) {
flag2 = false;
}
// 满足一个就行
return flag1 || flag2;
}