目录
081:游游的重组偶数
题目链接:游游的重组偶数__牛客网 (nowcoder.com)
题目:
题解:
将整数x转化为字符串s,遍历s将偶数字符和最后一位交换即可(先将最后一位为偶数已符合的排除,防止交换后出现前导零的情况)
#include <iostream>
#include<string>
using namespace std;
typedef long long LL;
LL q,x;
int main()
{
cin>>q;
while(q--)
{
cin>>x;
if(x%2==0)
{
cout<<x<<endl;
continue;
}
string s=to_string(x);
int n=s.size();
int flag=0;
for(int i=0;i<n;i++)
{
if((s[i]-'0')%2==0 && flag==0)
{
flag=1;
char ch=s[i];
s[i]=s[n-1];
s[n-1]=ch;
}
}
if(flag==1)
{
cout<<s<<endl;
}
if(flag==0) cout<<-1<<endl;
}
return 0;
}
082:体操队形
题目链接:体操队形 (nowcoder.com)
题目:
题解:
递归+dfs
#include<iostream>
using namespace std;
const int N=15;
int n,ret=0;
bool vis[N];
int arr[N];
void dfs(int pos)
{
if(pos==n+1)
{
ret++;
return;
}
for(int i=1;i<=n;i++)
{
if(vis[i]) continue; //当前i已经放过了-剪枝
if(vis[arr[i]]) return; //剪枝
vis[i]=true;//相当于放上了i
dfs(pos+1);
vis[i]=false;//回溯-恢复现场
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>arr[i];
}
dfs(1);
cout<<ret<<endl;
return 0;
}
083:二叉树中的最大路径和
题目链接:二叉树中的最大路径和_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
递归/dfs/树形dp
1). 左⼦树收集:以左⼦树为起点的最⼤单链和;
2). 右⼦树收集:以右⼦树为起点的最⼤单链和;
3). 根节点要做的事情:整合左右⼦树的信息,得到经过根节点的最⼤路径和;
4). 向上返回:以根节点为起点的最⼤单链和;
class Solution {
public:
int ret=-1010;
int maxPathSum(TreeNode* root)
{
dfs(root);
return ret;
}
int dfs(TreeNode* root)
{
if(root==nullptr) return 0;
int l=max(0,dfs(root->left));//左子树的最大单链和
int r=max(0,dfs(root->right));//右子数的最大单链和
ret=max(ret,root->val+l+r);//root为根节点的最大路径和
return max(l,r)+root->val;//最大
}
};