总结的部分题目思路与代码,待完善。
【剑指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) f(i)=f(i+1)+f(i+2)∗g(i,i+1)

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++版本】相关推荐

  1. 剑指Offer - 面试题46. 把数字翻译成字符串(DP)

    1. 题目 给定一个数字,我们按照如下规则把它翻译为字符串: 0 翻译成 "a" , 1 翻译成 "b",--, 11 翻译成 "l",-- ...

  2. leetcode面试题46. 把数字翻译成字符串

    leetcode面试题46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:**0 翻译成 "a" ,1 翻译成 "b",--,11 翻译 ...

  3. leetcode刷题-面试题46. 把数字翻译成字符串

    面试题46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l& ...

  4. 把数字翻译成字符串python_LeetCode 面试题46. 把数字翻译成字符串 | Python

    面试题46. 把数字翻译成字符串 题目 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 " ...

  5. 【剑指offer】面试题46. 把数字翻译成字符串(java)

    给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l",--,25 翻译成 & ...

  6. [剑指 offer] -- 动态规划-- 面试题46. 把数字翻译成字符串

    1 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l",--,2 ...

  7. leetcode面试题46. 把数字翻译成字符串/典型的青蛙跳台阶题目(递归),动态规划

    文章目录 题目 基本思想 题目 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l&q ...

  8. 面试题46. 把数字翻译成字符串

    链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/ 题解:https://leetcode-cn. ...

  9. 力扣 面试题46. 把数字翻译成字符串 dp

    https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/ 思路:为了方便,我们把输入转换成一个字符串,并且下标 ...

  10. leetcode 题库46. 把数字翻译成字符串

    面试题46. 把数字翻译成字符串 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l& ...

最新文章

  1. 空标签作为占位符调整距离
  2. [转]多线程编程指南
  3. javafx FlowPane布局
  4. site_url()和base_url()
  5. Struts2源码阅读(三)_DispatcherConfigurationProvider
  6. swift 自定义TabBarItem
  7. new与malloc的不同
  8. [es7]es查询实践示例
  9. 鸿蒙曰意心养翻译,文言文情话及翻译
  10. jchdl - GSL实例 - Shifter
  11. 解决 Chrome 使用高德地图卡顿
  12. 基于PC的工业控制系统的优缺点分析
  13. glusterfs:Server-quorum和Client Quorum
  14. vue axios实战,请求天气预报接口
  15. nltk中文分句_利用NLTK进行分句分词
  16. 高斯消元法解线性方程组数学原理及Python手工实现
  17. dB 、dBSPL、dBFS、dBTP
  18. windows下服务器的数据的迁移解决方案
  19. 宇信易诚 两季度亏损与高管出走的背后
  20. BT656(4:2:2)YCbCr标准规范

热门文章

  1. Rails——migration
  2. STM32F103硬件SPI驱动ADS1256
  3. LTE 中的ANR以及TNL介绍
  4. iOS应用安全-专栏总目录(持续更新) 丨蓄力计划
  5. SSH 登录指纹验证
  6. multiset用法详解
  7. Hexo Icarus配置和美化升级
  8. 报表同比环比sql笔记
  9. 云计算的1024种玩法——如何快速搭建个人博客?
  10. U盘灯狂闪,读不到盘