腾讯音乐笔试ak代码
第一题卡了比较久,其实只要每次变成计数为双数的字母就好,因为aa和aaa都只需要一步就可以变成无重复
int minOperations(string str)
{
int cnt[300]={0};
long long ans=0;
for(auto &c:str)
{
cnt[c]++;
}
while(true)
{
int maxVal=INT_MIN, v=-1;
for(int i='a';i<='z';i++)
{
if(maxVal<cnt[i])
{
maxVal=cnt[i];
v=i;
}
}
if(maxVal<=1)
break;
int u=-1;
for(int i='a';i<='z';i++)
{
if(cnt[i]%2==0)
{
u=i;
break;
}
}
if(u==-1)
u='a';
cnt[v]-=2;
cnt[u]++;
ans++;
}
return ans;
} unordered_map<TreeNode*, int> levs;
const int MOD=1e9+7;
int getLev(TreeNode *root)
{
if(root==nullptr)
return 0;
if(!levs.count(root))
{
levs.insert(make_pair(root, 1+max(getLev(root->left), getLev(root->right))));
}
return levs[root];
}
int DFS(TreeNode *root)
{
if(!root->left && !root->right)
return 1;
int leftLev=levs[root->left], rightLev=levs[root->right];
int maxChildSum=leftLev>rightLev?DFS(root->left):DFS(root->right);
return (2*maxChildSum+1)%MOD;
}
int getTreeSum(TreeNode* tree)
{
getLev(tree);
return DFS(tree);
} 第三题会建树就可以写,枚举所有可能的情况,纯看代码功底了
vector<TreeNode*> createTree(vector<int>& preOrder, vector<int>& inOrder, int pl, int ph, int il, int ih)
{
if(pl>ph)
return vector<TreeNode*>{nullptr};
vector<TreeNode*> res;
for(int idx=il;idx<=ih;idx++)
{
if(preOrder[pl]==inOrder[idx])
{
int leftNum=idx-il;
auto leftChilds=createTree(preOrder, inOrder, pl+1, pl+leftNum,il,idx-1);
auto rightChilds=createTree(preOrder, inOrder, pl+leftNum+1, ph,idx+1,ih);
for(auto &leftChild:leftChilds)
{
for(auto &rightChild:rightChilds)
{
auto p=new TreeNode(preOrder[pl]);
p->left=leftChild;
p->right=rightChild;
res.push_back(p);
}
}
}
}
return res;
}
vector<TreeNode*> getBinaryTrees(vector<int>& preOrder, vector<int>& inOrder)
{
int n=preOrder.size();
return createTree(preOrder, inOrder, 0, n-1, 0, n-1);
}
查看6道真题和解析