2023 阿里达摩院笔试题 阿里笔试 0902
笔试时间:2023年9月2日 秋招
第一题
题目:小红的回文博弈
小红和朋友玩游戏,初始有一个字符串s,两个人轮流操作:
1、先将字符串重新排列;
2、如果可以通过重新排列得到一个回文串,则游戏结束,当前操作的人获胜;
3、否则,当前操作的人必须删除字符串中的一个字符;
小红先手,两人都采用最优策略,问最后谁能获胜。
输入描述
第一行一个整数t,表示数据组数;
接下来t行,每行一个字符串s,仅包含小写学母,长度不超过100000。(1<t< 20)
输出描述
输出t行,每行一个字符串,小红获胜输出“red”,朋友获胜输出“friend”。
样例输入
3
aab
abc
abcd
样例输出
red
red
friend
提示:
第一组,小红可以重新排列得到回文串"aba",获胜。
第二组,小红删除后,朋友无法获胜,朋友删除后只剩下一个字符,是回文串,小红获胜。
参考题解
Java:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int T = scanner.nextInt();
scanner.nextLine(); // Consume the newline character
while (T-- > 0) {
String s = scanner.nextLine();
int bs = 0;
for (char ch : s.toCharArray()) {
bs ^= 1 << (ch - 'a');
}
int m = Integer.bitCount(bs);
if (m == 0 || (m & 1) == 1) {
System.out.println("red");
} else {
System.out.println("friend");
}
}
}
}
Python:
T = int(input())
for _ in range(T):
s = input()
bs = 0
for ch in s:
bs ^= 1 << (ord(ch) - ord('a'))
m = bin(bs).count('1')
if m == 0 or m % 2 == 1:
print("red")
else:
print("friend")
第二题
题目:小红的二叉树
小红拿到一个奇怪的二叉树,如下图所示:
输入描述
第一层从左往右赋值,第二层从右往左赋值,第三层从左往右赋值.....以此类推。这个二叉树有无穷多层。
小红有t次询问,每次询问输入两个正整数x,y,她想知道x和y在二叉树上的路径长度是多少。你能帮帮她吗?
第一行输入一个正整数q,代表询问次数。接下来的q行,每行输入两个正整数x,y,代表一次询问。
输出描述
输出q行,每行输出一个整数,代表该次询问的答案。
样例输入
3
11 4
2 5
7 7
样例输出
5
3
0
参考题解
Java:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int q = scanner.nextInt();
while (q-- > 0) {
int x = scanner.nextInt();
int y = scanner.nextInt();
x = originId(x);
y = originId(y);
int result = solve(x, y);
System.out.println(result);
}
}
public static int bitCount(int x) {
int cnt = 0;
while (x != 0) {
cnt++;
x >>= 1;
}
return cnt;
}
public static int originId(int x) {
int k = bitCount(x) - 1;
if ((k & 1) == 0) {
return x;
} else {
retu
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2023 秋招笔试题汇总解析 文章被收录于专栏
2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。
