移动字母
移动字母
题目描述
给定一个只包含小写字母的字符串s,牛牛想将这个字符串中的所有’a’字母全部移动到字符串的末尾,而且保证其它字符的相对顺序不变。其中字符串s的长度<=1e6。
输入样例
"abcavv"
输出样例
"bcvvaa
解题思路
从头到尾遍历字符串s,当 s[i]!=‘a’,将串s的内容复制到ans,然后累计’a’的数量,累加到串ans的后面,最后返回结果。
AC代码
class Solution {
public:
string ans="";
string change(string s) {
// write code here
int len=s.size(),sa=0;
for(int i=0;i<len;i++)
{
if(s[i]=='a') sa++;
else ans+=s[i];
}
for(int i=0;i<sa;i++) ans+='a';
return ans;
}
};
魔法数字
题目描述
一天,牛妹找牛牛做一个游戏,牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的。
操作共有三种,如下:
1.在当前数字的基础上加一,如:4转化为5
2.在当前数字的基础上减一,如:4转化为3
3.将当前数字变成它的平方,如:4转化为16
你能帮牛牛解决这个问题吗?
输入
给定n,m,分别表示牛牛和牛妹的数字。
输出
返回最少需要的操作数。
输入样例
3,10
输出样例
2
数据范围
(1 ≤ \leq ≤ n,m ≤ \leq ≤ 1000)(1≤n,m≤1000)
解题思路
bfs,开个标记数组 vis[],0表示未访问过,1表示访问过。开个 cnt[] 数组记录一下变换次数,当 n 经过 一定次数的变换后等于 m ,返回 cnt[m]。
AC代码
class Solution {
public:
/**
* 返回最后要输出的答案
* @param n int整型 表示牛牛的数字
* @param m int整型 表示牛妹的数字
* @return int整型
*/
int solve(int n, int m) {
// write code here
int vis[2007]={0},cnt[2007]={0};
queue<int>q;
vis[n]=1;
q.push(n);
while(!q.empty())
{
int x=q.front();q.pop();
if(x==m) return cnt[x];
if(x*x<2*m-n && !vis[x*x])
{
q.push(x*x);
cnt[x*x]=cnt[x]+1;
vis[x*x]=1;
}
if(x+1<2*m-n && !vis[x+1])
{
q.push(x+1);
cnt[x+1]=cnt[x]+1;
vis[x+1]=1;
}
if(x-1>=0 && !vis[x-1])
{
q.push(x-1);
cnt[x-1]=cnt[x]+1;
vis[x-1]=1;
}
}
}
};
牛妹的春游
题目描述
众所周知,牛妹要组织公司的出游。要准备面包和饮料。她买到的面包和饮料都是捆绑销售的,也就是说,一个大包装里面x个面包+y个饮料,花费t元。
为了满足公司的要求,需要一定数量的面包和饮料。
你的任务就是帮助牛妹计算,为了满足公司需要,一共最少花费多少钱。
输入样例
5,60,[[3,36,120],[10,25,129],[5,50,250],[1,45,130],[4,20,119]]
输出样例
249
备注
每种大包装只能最多买一个,所需面包breadNum、饮料的总beverageNum均不超过2000,牛妹一定能找到满足要求的方案让大家能够出游。
解题思路
1.确定状态 dp[i][j]:表示 i 个面包,j瓶饮料的花费。
2.状态转移 dp[i+bread[i]] [j+beverage[j]]=min(dp[i][j]+cost,dp[i+bread[i+[bread[i]] [j+beverage[j]]。
AC代码
class Solution {
public:
/**
* @param breadNum int整型
* @param beverageNum int整型
* @param packageSum int整型vector<vector<>> 每个一维数组中有三个数,依次表示这个包装里面的面包数量、饮料数量、花费
* @return int整型
*/
int dp[2007][2007]={0};
int minCost(int breadNum, int beverageNum, vector<vector<int> >& packageSum) {
// write code here
memset(dp,0x3f,sizeof dp);
int len=packageSum.size();
dp[0][0]=0;
for(int i=0;i<len;++i)
for(int j=breadNum;j>=0;--j)
for(int k=beverageNum;k>=0;--k)
{
int tx=min(breadNum,j+packageSum[i][0]);
int ty=min(beverageNum,k+packageSum[i][1]);
dp[tx][ty]=min(dp[tx][ty],dp[j][k]+packageSum[i][2]);
}
return dp[breadNum][beverageNum];
}
};
这场题目不难,适合小白做,但是这种Leetcode这种模式我吐了,emmm