目录
025:添加逗号
题目:
题解:
将输入的数字,每次模上10,从个位开始取每一位数,把数变成字符依次加到字符串ret上,同时标记好每加3个数字,就加一个逗号,最后将ret倒序输出。
#include <iostream>
using namespace std;
int main()
{
long long n;
string rets, ret;
cin >> n;
int flag = 0;
while (n)
{
int ni = n % 10;
n /= 10;
if (flag == 3) //每3个数字加1个逗号
{
flag = 0;
rets += ',';
}
rets += ni + '0';
flag++;
}
//逆序
for (int i = rets.size() - 1; i >= 0; i--)
{
ret += rets[i];
}
cout << ret << endl;
}
026:跳台阶
题目:
题解:
动态规划:
1.状态表示:dp[i]表示:到达i号台阶的时候,一共有多少种方式。
2.状态转移方程(根据最后一步划分情况):到i台阶,可从i-1台阶跳一格到i台阶,也可从i-2台阶跳两个格到i台阶,两种情况相加即可得到dp[i]。
空间优化:参考斐波那契数列Fib[n]=Fib[n-1]+Fib[n-2],可借助a,b,c向右滚动实现c=a+b求到i台阶一共多少种方式。
#include <iostream>
#include<vector>
using namespace std;
int main() {
int n=0;
cin>>n;
vector<int> dp(41);
dp[1]=1;
dp[2]=2;
for(int i=3;i<=n;i++)
dp[i]=(dp[i-1]+dp[i-2]);
cout<<dp[n]<<endl;
}
027:扑克牌顺子
题目:
题解:
1. 排序+模拟:排序后,先统计一遍0的个数,再遍历找非0元素(遍历时发现有相同非0元素,必不成顺子),求非0元素之间的差,差大于1时,用0来填补,当0的个数足够填补时,可成顺子,不够时,不能成顺子。
2.规律:遍历数组,统计非0元素中(遍历时发现有相同非0元素,必不成顺子),最大最小值之间的差值,若差值大于4(数组长度为5),则返回false,反之返回true。注意:用了bool数组来标记遍历过的元素。
//排序+模拟
class Solution {
public:
bool IsContinuous(vector<int>& numbers)
{
sort(numbers.begin(),numbers.end());
int n=numbers.size();
int numo=0;
for(auto i:numbers)
{
if(i==0) numo++;
}
for(int i=0;i<n-1;i++)
{
int tmp=numbers[i+1]-numbers[i];
if(tmp>1 && numbers[i]>0)
{
numo-=(tmp-1); // 数组中的0来填补间隔来形成连续
}
if(tmp==0 && numbers[i]!=0) return false; //数组中出现相同的扑克,不能组成顺子
}
if(numo<0) return false;
else return true;
}
};
//规律
class Solution {
bool hash[14] = { 0 };
public:
bool IsContinuous(vector<int>& numbers)
{
int minval=14,maxval=0;
for(auto x:numbers)
{
if(x)//非0元素
{
if(hash[x]) return false; //有相同元素直接返回false
hash[x]=true;
maxval=max(maxval,x);//找最大值
minval=min(minval,x);//找最小值
}
}
if(maxval-minval>4) return false;//间隔太远绝对填不满
return true;
}
};