腾讯音乐笔试 java,惨烈
#腾讯音乐娱乐笔试#
第一题
public int minOperations (String str) {
// write code here
char[] ch = str.toCharArray();
int[] dir = new int[26];
for(int i = 0;i< ch.length;i++){
dir[ch[i] - 'a']++;
}
int res = 0;
int add = 0;
for(int i = 0;i< dir.length;i++){
if(dir[i]>=2){
int a = dir[i] / 2;
res += a;
dir[i] -= a*2;
//add= add+a;
}
if(add>0 && dir[i] == 0){
add--;
dir[i]++;
}
}
while(add>0){
for(int i = 0;i<dir.length;i++){
if(dir[i] == 0){
dir[i]++;
add--;
}
}
}
while(add>0){
res++;
add--;
}
return res;
}
当时用的用的while()-2操作60%超时了,改成了现在这版忘记了把add+a写上了只过了60%
第二题
ArrayList list = new ArrayList<>();
public ArrayList<TreeNode> getBinaryTrees (ArrayList<Integer> preOrder, ArrayList<Integer> inOrder) {
// write code here
if(preOrder.size() == 1){
list.add(new TreeNode(preOrder.get(0));
}
return process(preOrder,inOrder,0,preOrder.size() -1,0,preOrder.size() -1);
}
public TreeNode process(ArrayList<Integer> preOrder,ArrayList<Integer> InOrder,int pl,int pr,int il,int ir){
if(pl > pr|| il > ir){
return;
}
int val = preOrder.get(pl);
TreeNode root = new TreeNode(val);
int idx = 0;
for(int i = il;i< ir;i++){
if(InOrder.get(i) == val){
idx = i;
break;
}
root.left = process(preOrder,InOrder,pl + 1,pl +(idx - il),il,idx -1);
root.right = process(preOrder,InOrder,pl + (idx - il)+1,pr,idx +1,ir);
}
return root;
}
不知道怎么返回多个树,leetcode有原题啊,只是没这个重复值没过去
第三题
用的后序遍历
public int process(TreeNode root){
if(root == null){
return 0;
}
int left = process(root.left);
int right = process(root.right);
if(left == right){
root.val = root.left.val + root.right.val+1;
}else{
root.val = root.left.val > root.right.val ? 2*root.left.val +1:root.right.val +1;
}
return root.val %(10^9+7);
}
}
测试用例都这么多溢出的吗,只过了10%,听过求高度也会溢出,用long 处理,被int 溢出坑到过好多次了,太难了 #腾讯音乐娱乐笔试##腾讯音乐2023秋招笔试心得体会#
