腾讯音乐笔试
第一题:字符串
给定一个只包含小写字母字符串,每次可以选择两个相同的字符删除,并在字符串结尾新增任意一个小写字母。
请问最少多少次操作后,所有的字母都不相同?
字符串长度<1e3
input:
abab
output:
2
第一次把2个a变成f,第二次把2个b变成b。得到fb,每个字母都不相同,最少操作次数为2。
请问最少多少次操作后,所有的字母都不相同?
字符串长度<1e3
input:
abab
output:
2
第一次把2个a变成f,第二次把2个b变成b。得到fb,每个字母都不相同,最少操作次数为2。
public static int minOperations (String str) {
int[] nums = new int[26];
for (int i = 0; i < str.length(); i++) {
nums[str.charAt(i) - 'a']++;
}
int cnt = 0, kinds = 0;
for (int i = 0; i < 26; i++) {
cnt += nums[i] / 2;
kinds += nums[i] % 2;
}
if (cnt + kinds <= 26) {
return cnt;
} else {
int a = 26 - kinds;
return 2 * cnt - a;
}
} 第二题: 题目描述
已知一个二叉树的先序遍历序列和中序遍历序列,但其中一些节点的值可能相同。
请你返回所有满足条件的二叉树。二叉树在数组中的顺序是任意的。
input:
[1,1,2],[1,2,1]
output:
[{1,1,#,#,2},{1,#,1,2}]
已知一个二叉树的先序遍历序列和中序遍历序列,但其中一些节点的值可能相同。
请你返回所有满足条件的二叉树。二叉树在数组中的顺序是任意的。
input:
[1,1,2],[1,2,1]
output:
[{1,1,#,#,2},{1,#,1,2}]
public ArrayList<TreeNode> getBinaryTrees (ArrayList<Integer> preOrder, ArrayList<Integer> inOrder) {
ArrayList<TreeNode> temp = dfs(preOrder, inOrder);
System.out.println(temp.size());
return temp;
}
public ArrayList<TreeNode> dfs(ArrayList<Integer> preOrder, ArrayList<Integer> inOrder) {
ArrayList<TreeNode> ans = new ArrayList<>();
if (inOrder.size() == 0) {
return ans;
}
int rootVal = preOrder.get(0);
for (int i = 0; i < inOrder.size(); i++) {
int k = inOrder.get(i);
if (rootVal == k) {
ArrayList<Integer> inOrderLeft = new ArrayList<>();
ArrayList<Integer> inOrderRight = new ArrayList<>();
ArrayList<Integer> preOrderLeft = new ArrayList<>();
ArrayList<Integer> preOrderRight = new ArrayList<>();
if (i > 0) {
int sum = 0;
for (int z = 0; z < i; z++) {
inOrderLeft.add(inOrder.get(z));
sum += inOrder.get(z);
}
for (int z = 1; z <= i; z++) {
preOrderLeft.add(preOrder.get(z));
sum -= preOrder.get(z);
}
if (sum != 0) {
continue;
}
}
if (i < inOrder.size()) {
for (int z = i + 1; z < inOrder.size(); z++) {
inOrderRight.add(inOrder.get(z));
preOrderRight.add(preOrder.get(z));
}
}
List<TreeNode> left = dfs(preOrderLeft, inOrderLeft);
List<TreeNode> right = dfs(preOrderRight, inOrderRight);
if (left.size() > 0 && right.size() > 0) {
for (TreeNode l : left) {
for (TreeNode r : right) {
TreeNode root = new TreeNode(rootVal);
root.left = l;
root.right = r;
ans.add(root);
}
}
} else if (left.size() > 0) {
for (TreeNode l : left) {
TreeNode root = new TreeNode(rootVal);
root.left = l;
ans.add(root);
}
} else if (right.size() > 0) {
for (TreeNode r : right) {
TreeNode root = new TreeNode(rootVal);
root.right = r;
ans.add(root);
}
} else {
TreeNode root = new TreeNode(rootVal);
ans.add(root);
}
}
}
return ans;
} 
查看10道真题和解析