[Lc]面试题46把数字翻译成字符串
Contents
题目
题解
这道题和91题很像,区别在于这道题从0开始编码,就不用讨论当前数为0的情况,因此更简单,可以转化为字符串使用91题的方法进行解决,这里不再赘述,也可以使用循环求余法,从右往左计算,具体见注释
- 时间复杂度$O(n)$
- 空间复杂度$O(1)$
//和91类似,区别是这个编码从0开始,91从1开始
//而且91是字符串,这道题也可以转化为字符串用91中的方法
//这里用取余法,注意这里是从右往左,因为是从0开始,从左往右从右往左都可以
class Solution {
public:
int translateNum(int num) {
int pre=1, cur=1, x, y=num%10;//pre是dp[i-1],cur是dp[i],x是当前位,y是上一位
while(num){//num还没除尽就继续遍历
num /= 10;
x = num%10;//这两部是更新x
int tmp = cur;//这时tmp变为dp[i-1],cur是dp[i],pre是dp[i-2]
int xy = x*10 + y;//将x,y合并看其大小
if(xy<=25 && xy>=10) cur = tmp + pre;//若可以合并,则dp[i]=dp[i-1]+dp[i-2]
else cur = tmp;//否则dp[i] = dp[i-1]
pre = tmp;//更新pre
y = x;//更新y(x在循环体开头更新)
}
return cur;
}
};
Author ChrisHRZ
LastMod 2020-06-11