A:移动字母
题目描述
给定一个只包含小写字母的字符串s,牛牛想将这个字符串中的所有’a’字母全部移动到字符串的末尾,而且保证其它字符的相对顺序不变。其中字符串s的长度<=1e6。
输入
"abcavv"
输出
"bcvvaa"
思路:遍历一遍字符串,把不是a的字符按顺序组成新的字符串,同时统计字符串中的a的个数cnt,最后在新字符串尾加上cnt个a。
class Solution {
public:
/**
*
* @param s string字符串
* @return string字符串
*/
string change(string s){
int l = s.length();
string ss = "";
int cnt = 0;
for(int i = 0; i < l; i++){
if(s[i]=='a'){
cnt++;
}else{
ss += s[i];
}
}
while(cnt--) ss += 'a';
return ss;
}
};
B:魔法数字
题意:
一天,牛妹找牛牛做一个游戏,牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的。
操作共有三种,如下:
1.在当前数字的基础上加一,如:4转化为5
2.在当前数字的基础上减一,如:4转化为3
3.将当前数字变成它的平方,如:4转化为16
你能帮牛牛解决这个问题吗?
输入
3,10
输出
2
class Solution {
public:
/**
* 返回最后要输出的答案
* @param n int整型 表示牛牛的数字
* @param m int整型 表示牛妹的数字
* @return int整型
*/
// n->k1->k2->....->m 递归 效益最大化每一步
int solve(int n, int m) {
if(n>=m) return n-m; // 当n>=m时只有n不断的-1才能变成m
int k = 1;
while(k*k<m) k++; // 找到k*k>=m的最小值
if(k*k-m>m-(k-1)*(k-1)) k--; // k*k和(k-1)*(k-1)哪个数和m的差小
// 此时k*K与m的距离(差的绝对值)最小
return min(m-n,solve(n,k)+1+abs(m-k*k));
// 第一种情况直接n不断+1到m 需要m-n次操作
// 第二种情况当前的k->m需要k*k的一次操作以及k*k到m的操作数,然后递归的找n->k的最少操作数
// 递归继续寻找
}
}
C:牛妹的春游
题目描述
众所周知,牛妹要组织公司的出游。要准备面包和饮料。她买到的面包和饮料都是捆绑销售的,也就是说,一个大包装里面x个面包+y个饮料,花费t元。
为了满足公司的要求,需要一定数量的面包和饮料。
你的任务就是帮助牛妹计算,为了满足公司需要,一共最少花费多少钱。
输入
5,60,[[3,36,120],[10,25,129],[5,50,250],[1,45,130],[4,20,119]]
输出
249
备注:
每种大包装只能最多买一个,所需面包breadNum、饮料的总量beverageNum均不超过2000
牛妹一定能找到满足要求的方案让大家能够出游。
class Solution {
public:
/**
*
* @param breadNum int整型
* @param beverageNum int整型
* @param packageSum int整型vector<vector<>> 每个一维数组中有三个数,依次表示这个包装里面的面包数量、饮料数量、花费
* @return int整型
*/
int dp[2010][2010];
int minCost(int breadNum, int beverageNum, vector<vector<int> >& packageSum) {
memset(dp,0x3f3f3f,sizeof(dp));
dp[0][0] = 0; // 初始化0面包0饮料所需0元
for(int i = 0; i < packageSum.size(); i++){ // 遍历所有的包装
for(int j = breadNum; j >= 0; j--){ // 遍历所需面包
for(int k = beverageNum; k >= 0; k--){ // 遍历所需饮料
// 当前面包数减去当前包装面包数,负数取0
// 当前饮料数减去当前包装饮料数,负数取0
// 最后加上当前包装所需的钱与当前最优解取小
dp[j][k] = min(dp[j][k],dp[max(j-packageSum[i][0],0)][max(k-packageSum[i][1],0)]+packageSum[i][2]);
}
}
}
return dp[breadNum][beverageNum];
}
};