
解法一 数学建模
1.每次取最后两位数,rem = num % 100
2.若rem > 25,则无法表示,即rem的个位和十位无法合一起,则用translateNum(num/10),表示前进一位
3.若在00 <= rem <= 09,则无法表示,即rem的个位和十位无法合一起,所以用translateNum(num/10)
4.若在10 <= rem <= 25,则可以分出两种表示方法,所以用translateNum(num/10) + translateNum(num/100)递归来计算数量
5.所以总结以上就是:
if (num < 10),则加1
if (num%100 < 10 || num%100 > 25) translateNum(num/10);
if (10 <= num % 100 <= 25) translateNum(num/10) + translateNum(num/100);
class Solution {
public:
int translateNum(int num) {
if(num<10) return 1;
return (num%100<10 || num%100>25)?translateNum(num/10):translateNum(num/10)+translateNum(num/100);
}
};
解法二 动态规划
用 dp[i] 来表示前 i 个数一共有多少种翻译方法。
当两个数的组合处于 [10, 25] 的区间,dp[i] = dp[i - 2] + dp[i - 1];当两个数的组合不在 [10, 25] 的区间,dp[i] = dp[i - 1]。
class Solution {
public:
int translateNum(int num) {
if(num<10) return 1;
string nums=to_string(num);
int len= nums.size();
vector<int> dp(len+1);
dp[0]=1;
dp[1]=1;
for (int i = 2; i < len+1; i++)
{
if(nums[i-2]=='1' || (nums[i-2]=='2'&& nums[i-1]<='5')){
dp[i]=dp[i-2]+dp[i-1];
}
else{
dp[i]=dp[i-1];
}
}
return dp[len];
}
};
本文探讨了如何通过数学建模和动态规划方法解决将数字表示成两位数组合的问题,详细介绍了步骤和两种算法实现。关键步骤包括判断是否能合为一个两位数,递归计算不同情况下的表示方法。
238

被折叠的 条评论
为什么被折叠?



