目录
025:添加逗号
026:跳台阶
027:扑克牌顺子
025:添加逗号
添加逗号_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
将输入的数字,每次模上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:跳台阶
跳台阶_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
动态规划:
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:扑克牌顺子
扑克牌顺子_牛客题霸_牛客网 (nowcoder.com)
题目:
题解:
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; //有相同元素直接返回falsehash[x]=true;maxval=max(maxval,x);//找最大值minval=min(minval,x);//找最小值}}if(maxval-minval>4) return false;//间隔太远绝对填不满return true;}
};