2021年01月20日 周三 天气晴 【不悲叹过去,不荒废现在,不惧怕未来】
1. 题目简介
2. 动态规划(对称)
解题思路我就直接粘贴 Krahets 大佬的了:
2.1 字符串遍历
class Solution {
public:
int translateNum(int num) {
string s = to_string(num);
int a = 1, b = 1;
for(int i=1;i<s.size();++i){
int tmp = 10*(s[i-1]-'0')+(s[i]-'0');
int c = tmp>=10&&tmp<=25?(a+b):b;
a = b;
b = c;
}
return b;
}
};
- 时间复杂度: O ( n ) O\left( {n} \right) O(n)
- 空间复杂度: O ( n ) O\left( {n} \right) O(n) (字符串使用的)
2.2 数字求余
因为求余是从右往左的,所以这种解法有个大前提就是动态规划必须是对称的,即:从左往右和从右往左计算结果是一样的。 刚好本题的动态规划满足对称的条件。
class Solution {
public:
int translateNum(int num) {
int a = 1, b = 1, x, y = num%10;
while(num/10){
num /= 10;
x = num % 10;
int tmp = 10*x+y;
int c = tmp>=10&&tmp<=25?(a+b):b;
a = b;
b = c;
y = x;
}
return b;
}
};
- 时间复杂度: O ( n ) O\left( {n} \right) O(n)
- 空间复杂度: O ( 1 ) O\left( {1} \right) O(1)
参考文献
《剑指offer 第二版》
https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/solution/mian-shi-ti-46-ba-shu-zi-fan-yi-cheng-zi-fu-chua-6/