2023 腾讯笔试题 0326
笔试时间:2023年3月26日 春招实习
第二题
题目:层序遍历二叉树
小红拿到一棵满二叉树,她通过层序遍历的顺序把每个节点的权值都告诉了你,保证每个节点的权值都不相同。现在小红有q次询问,每次询问一个权值,小红想知道:
1、这个节点是否存在?
2、这个节点的左儿子和右儿子的权值是多少?
输入描述
第一行输入一个正整数n,代表二叉树的层数;
第二行输入 2n-1个正整数ai,代表这个完全二叉树的层序遍历;
第三行输入一个正整数q,代表询问次数。
接下来q行,每一行输入一个x,代表一次询问。
1≤n≤20,1≤q≤10^5,1≤x≤10^9,1≤ai≤10^9
输出描述
如果存在权值为x的节点,则先输出一个字符串“Yes”。若该节点为叶子节点,则下一行输出一个字符串“LEAF”。若该节点不是叶子节点,则下一行输出两个正整数,分别代表该节点的左儿子和右儿子的权值。如果不存在权值为x的节点,则直接输出一个字符串“No”。
样例输入
2
1 2 3
3
1
3
5
样例输出
Yes
2 3
Yes
LEAF
No
参考题解
满二叉树的层序遍历下标满足以下关系:i的左孩子为:i*2+1;i的右孩子为:i*2+2
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> a(2 * n - 1);
unordered_map<int, int> mp;
for (int i = 0; i < 2 * n - 1; i++) {
cin >> a[i];
mp[a[i]] = i;
}
int q;
cin >> q;
for (int i = 0; i < q; i++) {
int x;
cin >> x;
if (mp.find(x) == mp.end()) {
cout << "No" << endl;
} else {
cout << "Yes" << endl;
int index = mp[x];
if (index * 2 + 1 < 2 * n - 1) {
int l = index * 2 + 1;
int r = index * 2 + 2;
cout << a[l] << " " << a[r] << endl;
} else {
cout << "LEAF" << endl;
}
}
}
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int[] a = new int[2 * n - 1];
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < 2 * n - 1; i++) {
a[i] = scanner.nextInt();
map.put(a[i], i);
}
int q = scanner.nextInt();
for (int i = 0; i < q; i++) {
int x = scanner.nextInt();
if (!map.containsKey(x)) {
System.out.println("No");
} else {
System.out.println("Yes");
int index = map.get(x);
if (index * 2 + 1 < 2 * n - 1) {
int l = index * 2 + 1;
int r = index * 2 + 2;
System.out.println(a[l] + " " + a[r]);
} else {
System.out.println("LEAF");
}
}
}
}
}
Python:[此代码未进行大量数据的测试,仅供参考]
n = int(input())
a = [int(c) for c in input().split(" ")]
map = {a[i]:i for i in range(2**n - 1)}
q = int(input())
for _ in range(q):
x = int(input())
if x not in map:
print("No")
else:
print("Yes")
index = map[x]
if index * 2 + 1 < n:
l, r = index * 2 + 1, index * 2 + 2
print(a[l],end=" ")
print(a[r])
else:
print("LEAF")
第三题
题目:折叠回文串
给出一个长度为n的字符串串s,你可以进行折叠字符串的回文子串操作任意次(可以0次),如abba折叠后可以为ab (字符串向左折叠)或ba(字符串向右折叠);baaab折叠后可以为baa(字符串向左折叠)或aab(字符串向右折叠)。通过执行上述操作可以得到多少种不同的字符串?
1.子串必须是连续的,比如abc的子串有a,b,c,ab,bc,abc,但是ac不是子串
2.回文是从头到尾读和从尾到头读是一样的
输入描述
第一行输入一个整数n(1<=n<=18)。
第二行一个长度为n的字符串s,字符串仅包含小写字母。
输出描述
输出一个整数表示答案。
样例输入
3
aba
样例输出
3
折叠0次,可以得到aba。
折叠1次,可以得到ab或ba
一共可以得到三种不同的字符串。
参考题解
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream>
#include <vector>
#include <string>
#include <unordered_set>
using namespace std;
vector<vector<bool>> getDp(int n, string s) {
vector<vector<bool>> dp(n, vector<bool>(n, false));
for (int i = 0; i < n; i++) {
dp[i][i] = true;
}
for (int i = 0; i < n - 1; i++) {
if (s[i] == s[i + 1]) {
dp[i][i + 1] = true;
}
}
for (int gap = 2; gap < n; gap++) {
for (int i = 0; i < n - gap; i++) {
int j = i + gap;
if (s[i] == s[j] && dp[i + 1][j - 1]) {
dp[i][j] = true;
}
}
}
return dp;
}
unordered_set<string> res;
void dfs(string cur) {
if (cur == "b") {
// Handle 'b' case if needed
}
if (cur.length() >= 1) {
res.insert(cur);
}
vector<vector<bool>> dp = getDp(cur.length(), cur);
for (int i = 0; i < cur.length(); i++) {
for (int j = i + 1; j < cur.length(); j++) {
if (dp[i][j]) {
int l = j - i + 1;
if (l % 2 == 0) {
dfs(cur.substr(0, i + l / 2) + cur.substr(j + 1));
dfs(cur.substr(0, i) + cur.substr(i + l / 2));
} else {
dfs(cur.substr(0, i + 1 + l / 2) + cur.substr(j + 1));
dfs(cur.substr(0, i) + cur.substr((i + j) / 2));
}
}
}
}
}
int main() {
int n;
cin >> n;
string input;
cin >> input;
dfs(input);
cout << res.size() << endl;
return 0;
}
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.*;
public class Main {
static Set<String> res = new HashSet<>();
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
scanner.nextLine();
String input = scanner.nextLine();
dfs(input);
System.out.println(res.size());
}
static boolean[][] getDp(int n, String s) {
boolean[][] dp = new boolean[n][n];
for (int i = 0; i < n; i++) {
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2023秋招各大笔试题汇总,c++,java,python多种语言分析,解答。
