【剑指offer】面试题46:把数字翻译成字符串【C++版本】
总结的部分题目思路与代码,待完善。
【剑指offer-第二版】部分题目与解答【C++版本】
题目:
给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成“a” “a”“a”,1翻译成“b” “b”“b”,……,11翻译成“l” “l”“l”(小写的“L” “L”“L”),……,25翻译成“z” “z”“z”。一个数字可能有多个翻译。例如:12258有5种不同的翻译,分别是“bccfi” “bccfi”“bccfi” 、“bwfi” “bwfi”“bwfi” 、“bczi” “bczi”“bczi” 、“mcfi” “mcfi”“mcfi” 和 “mzi” “mzi”“mzi”。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。
解题思路:
1.使用动态规划的思路来进行求解。
2.确定子问题:以12258为例子,求解12258有多少种翻译方法,可以分解为两个子问题,第一个子问题为’1’单独翻译和”2258”翻译,第二个为”12”联合翻译,”258”进行翻译。这样就等于求解”2258”和”258”一共有多少中翻译方法,以此类推。
3.确定转移方程:f(i) f(i)f(i)代表从第i位数字开始不同翻译的数目,那么
f(i) = f(i+1)+f(i+2)*g(i,i+1)。其中当第i ii位和第i+1'>i+1 i+1i+1位组合到一起可以翻译的时候(即在10~25的范围内),g(i,i+1) g(i,i+1)g(i,i+1)等于1,否则等于0。
4.尽量避免重复的子问题,选择使用自下而上、从小到达的方法来解决。把子问题的结果记录下来,用于计算下一次更大的问题。
//和《剑指offer》原解法略不同的方法
仍然使用动态规划的方法,剑指offer是从数字的末尾开始计算的,我们也可以从数字的开头开始计算。以12258为例子:
1.设f(i)为从高位开始的前i位数字可以翻译的方法数。f(0) = 1 且f(1) = 1
2.从i = 1开始,如果f(i)和f(i-1)组合起来可以一起翻译,那么f(i) = f(i-1)+f(i-2),否则f(i) = f(i-1)
#include <vector>
#include <string>
#include <stdlib.h>
#include <iostream>
#include <algorithm> using namespace std; //记录用的数组,初始化f(0) = 1,f(1) = 1
int cnt[70] = {1,1}; int getTranslationCnt(int num)
{ if(num < 0)return 0; //转换成为string来处理 string numS = to_string(num); int numSize = numS.size(); //从i=1,即从左到右第2个数字开始进行计算 for(int i = 1;i != numSize;i++){ //如果前一个数字是1,那么和当前数字总是能合并翻译 //所以f(i) = f(i-1)+f(i-2) if(numS[i-1] == '1'){ cnt[i+1] = cnt[i] + cnt[i-1]; } //如果前一个数字是2,那么只有当前数字是0~5才能合并翻译else if(numS[i-1] == '2'){ if(numS[i] >= '0' && numS[i] <= '5'){cnt[i+1] = cnt[i] + cnt[i-1]; } else{ cnt[i+1] = cnt[i]; } } //前一个数字是其他数字,都不能合并翻译 else{ cnt[i+1] = cnt[i]; } } return cnt[numSize];
} int main()
{ cout << "Please enter a posi integer:" << endl; int test; while(cin >> test){ cout << "The translation cnts are: " << getTranslationCnt(test) << endl;//输入ctrl+d来退出,linux下的退出 cout << "Please enter a posi integer(ctrl+d to quit):" << endl;} return 0;
}
程序运行结果:
【剑指offer】面试题46:把数字翻译成字符串【C++版本】相关推荐
- 剑指Offer - 面试题46. 把数字翻译成字符串(DP)
1. 题目 给定一个数字,我们按照如下规则把它翻译为字符串: 0 翻译成 "a" , 1 翻译成 "b",--, 11 翻译成 "l",-- ...
- leetcode面试题46. 把数字翻译成字符串
leetcode面试题46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:**0 翻译成 "a" ,1 翻译成 "b",--,11 翻译 ...
- leetcode刷题-面试题46. 把数字翻译成字符串
面试题46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l& ...
- 把数字翻译成字符串python_LeetCode 面试题46. 把数字翻译成字符串 | Python
面试题46. 把数字翻译成字符串 题目 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 " ...
- 【剑指offer】面试题46. 把数字翻译成字符串(java)
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l",--,25 翻译成 & ...
- [剑指 offer] -- 动态规划-- 面试题46. 把数字翻译成字符串
1 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l",--,2 ...
- leetcode面试题46. 把数字翻译成字符串/典型的青蛙跳台阶题目(递归),动态规划
文章目录 题目 基本思想 题目 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l&q ...
- 面试题46. 把数字翻译成字符串
链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/ 题解:https://leetcode-cn. ...
- 力扣 面试题46. 把数字翻译成字符串 dp
https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/ 思路:为了方便,我们把输入转换成一个字符串,并且下标 ...
- leetcode 题库46. 把数字翻译成字符串
面试题46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l& ...
最新文章
- 空标签作为占位符调整距离
- [转]多线程编程指南
- javafx FlowPane布局
- site_url()和base_url()
- Struts2源码阅读(三)_DispatcherConfigurationProvider
- swift 自定义TabBarItem
- new与malloc的不同
- [es7]es查询实践示例
- 鸿蒙曰意心养翻译,文言文情话及翻译
- jchdl - GSL实例 - Shifter
- 解决 Chrome 使用高德地图卡顿
- 基于PC的工业控制系统的优缺点分析
- glusterfs:Server-quorum和Client Quorum
- vue axios实战,请求天气预报接口
- nltk中文分句_利用NLTK进行分句分词
- 高斯消元法解线性方程组数学原理及Python手工实现
- dB 、dBSPL、dBFS、dBTP
- windows下服务器的数据的迁移解决方案
- 宇信易诚 两季度亏损与高管出走的背后
- BT656(4:2:2)YCbCr标准规范