函数式编程,打力扣打得少,需要补足
A:给你一个字符串,把字符串中的所有a移动到末尾即可。
简单模拟,记录一下a的个数,最后再加上就行。
class Solution {
public:
/**
*
* @param s string字符串
* @return string字符串
*/
string change(string s) {
// write code here
string ans = "";
int num = 0;
for(int i = 0; i < s.length(); i++)
{
if(s[i] == 'a')
num++;
else ans += s[i];
}
for(int i = 1; i <= num; i++)
{
ans += 'a';
}
return ans;
}
};
B:给你数字n和m,还有+1,-1,平方三种操作方式,问最少多少次操作可以使n变成m
很显然的bfs,但是注意剪枝
此外,剪枝函数不要定为1000,以为可能平方之后大于1000,然后再执行-1操作。
剪枝函数的范围需要注意。
class Solution {
public:
/**
* 返回最后要输出的答案
* @param n int整型 表示牛牛的数字
* @param m int整型 表示牛妹的数字
* @return int整型
*/
int solve(int n, int m)
{
pair<int,int> p;
p.first = n;
p.second = 0;
int vis[1050] = {0};
vis[n] = 1;
queue<pair<int,int>> q;
q.push(p);
while(!q.empty())
{
pair<int,int> u = q.front();
q.pop();
if(u.first == m) return u.second;
vis[u.first] = 1;
pair<int,int> next1,next2,next3;
next1.second = u.second + 1;
next2.second = u.second + 1;
next3.second = u.second + 1;
next1.first = u.first + 1;
next2.first = u.first - 1;
next3.first = u.first * u.first;
if(next1.first <= 1050 && next1.first >= 1 && vis[next1.first] == 0)
q.push(next1);
if(next2.first <= 1050 && next2.first >= 1 && vis[next2.first] == 0)
q.push(next2);
if(next3.first <= 1050 && next3.first >= 1 && vis[next3.first] == 0)
q.push(next3);
}
}
};
C:你去购买面包和饮料,需要面包n个,饮料m瓶,购买的是包装,花费t,问最少花费。
二维的01背包。
dp [ j ] [k]剩余容量为j,k时的最少花费。
因为可以买多,所以,买多的部分直接写成0.
class Solution {
public:
int dp[2000][2000];
int minCost(int a, int b, vector<vector<int> >& p) {
memset(dp, 0x3f, sizeof dp);
dp[0][0] = 0;
for (int i = 0; i < p.size(); ++i)
for (int j = a; j >= 0; --j)
for (int k = b; k >= 0; --k)
{
dp[j][k] = min(dp[j][k], dp[max(j - p[i][0], 0)][max(k - p[i][1], 0)] + p[i][2]);
// 买多的话就记为0
}
return dp[a][b];
}
};