新增3 把数字翻译为字符串

题目要求:

  给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”…25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。

思路:递归,遍历数字的位,当前位翻译一种方法,如果当前位和下一位能结合成另一种翻译,则有可记录为一种方法。但是递归会找出重复计算,如12258会计算1,2258和12,258,而2258会2,258,我们定义f(i)表示从第i位数字开始的不同翻译的数目,那么f(i) = f(i + 1) + g(i,i + 1) * f(i + 2)。当第i位和第i + 1位两位数字拼接起来的数字在10 ~ 25的范围内时,函数g(i,i + 1)的值为1,否则为0.

有重复,可以使用动态规划。从后往前求,比记录翻译方法数。

//递归
int getTransCount(const string & numstr, int i)
{
    int len = numstr.size();

    //超过长度,只有一种可能
    if (i >= len - 1) {
        return 1;
    }
    //[i]和[i+1]可以组合成一个字符的,有两种方案
    if (i + 1 < len ) { int sum = (numstr[i] - ‘0‘) * 10 + numstr[i + 1] - ‘0‘; if (sum > 9 && sum < 26) {
            return getTransCount(numstr,i+1) + getTransCount(numstr,i+2);
        }
    }
    //不能组合成一个字符的
    return getTransCount(numstr, i + 1);
}
//动态规划,从后往前,并记录
int getTransCount(const string & numstr)
{
    int len = numstr.size();
    vector  dp(len);
    int cur = 0;
    for (int i = len - 1; i >= 0; i--) {
        cur = 0;
        //当前数字为方法
        if (i < len - 1) {
            cur = dp[i + 1];
        }else{
            cur = 1;
        }
        //两个能不能组合成一个字符
        if (i < len - 1) { int sum = (numstr[i] - ‘0‘) * 10 + numstr[i + 1] - ‘0‘; if (sum > 9 && sum < 26) {
                if (i < len - 2) {
                    cur += dp[i + 2];
                }
                else {
                    cur += 1;
                }
            }
        }
        dp[i] = cur;
    }
    return dp[0];
}

//获得数字的翻译组合
int getTransCount(int number)
{
    if (number < 0) {
        return 0;
    }
    string numstring = to_string(number);
    //递归方式
    //return getTransCount(numstring,0);
    //非递归方式
    return getTransCount(numstring);
}

//牛客网上没有该题目,对应测试如下
//单元测试
void test(char *testname, int index, int expect)
{
    int result = getTransCount(index);
    if (result == expect) {
        cout << testname << " passed." << endl;
    }
    else {
        cout << testname << " failed." << endl;
    }

}

int main(void)
{
    test("num0", 0, 1);
    test("num10", 10, 2);
    test("num126", 126, 2);
    test("num426", 426, 1);
    test("num12258", 12258, 5);

    return 0;
}

详细版本

//动态规划,从后往前,并记录
int getTransCount(const string & numstr)
{
    int len = numstr.size();
    vector<int>  dp(len);
    int cur = 0;
    for (int i = len - 1; i >= 0; i--) {
        cur = 0;
        //当前数字为方法
        if (i < len - 1) {
            cur = dp[i + 1];
        }else{
            cur = 1;
        }
        //两个能不能组合成一个字符
        if (i < len - 1) {           int sum = (numstr[i] - ‘0‘) * 10 + numstr[i + 1] - ‘0‘;           if (sum > 9 && sum < 26) {
                  if (i < len - 2) {
                      cur += dp[i + 2];
                  }
                  else {
                      cur += 1;
                  }
              }
        }
        dp[i] = cur;
    }
    return dp[0];
}

//获得数字的翻译组合
int getTransCount(int number)
{
    if (number < 0) {
        return 0;
    }
    string numstring = to_string(number);
    return getTransCount(numstring);
}

原文地址:https://www.cnblogs.com/dingxiaoqiang/p/8613474.html

时间: 2024-10-29 21:25:24

新增3 把数字翻译为字符串的相关文章

剑指Offer对答如流系列 - 把数字翻译成字符串

面试题46:把数字翻译成字符串 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻译成"b",--,11翻译成"l",--,25翻译成"z".一个数字可能有多个翻译.例如12258有5种不同的翻译,它们分别"bccfi", "bwfi", "bczi", "mcfi" 和"mzi" .请编程实现一个函

《剑指offer》第四十六题:把数字翻译成字符串

// 面试题46:把数字翻译成字符串 // 题目:给定一个数字,我们按照如下规则把它翻译为字符串:0翻译成"a",1翻 // 译成"b",……,11翻译成"l",……,25翻译成"z".一个数字可能有多个翻译.例 // 如12258有5种不同的翻译,它们分别是"bccfi"."bwfi"."bczi"."mcfi"和 // "mzi&qu

剑指offer:把数字翻译成字符串

题目要求:给定一个数字,按照如下规则翻译成字符串:0翻译成"a",1翻译成"b"...25翻译成"z".一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi.实现一个函数,用来计算一个数字有多少种不同的翻译方法. # -*- coding: utf-8 -*- # @Time : 2019-07-10 21:13 # @Author : Jayce Wong # @ProjectName : j

【Offer】[46] 【把数字翻译成字符串】

题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串: 0翻译成"a",1翻译成"b",..... 11翻译成"1",...... 25翻译成"z".一个数字可能有多个翻译.例如,12258有5种不同的翻译,分别是"bccfi""bwfi"."bczi"."mcfi"和"mzi&q

剑指offer——48把数字翻译成字符串

题目要求: 给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”...25翻译成“z”.一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi.实现一个函数,用来计算一个数字有多少种不同的翻译方法. 解题思路: 下面我们从自上而下和自下而上两种角度分析这道题目,以12258为例: 自上而下,从最大的问题开始,递归 : 有很多子问题被多次计算,比如258被翻译成几种这个子问题就被计算了两次. 自然想到可以用动态规划来解决,用f(i

剑指OFFER----面试题46. 把数字翻译成字符串

链接:https://leetcode-cn.com/problems/ba-shu-zi-fan-yi-cheng-zi-fu-chuan-lcof/submissions/ 代码 class Solution { public: int translateNum(int num) { int n = 0; string s = ""; while (num) { s += to_string(num % 10); num /= 10; n++; } reverse(s.begin(

java 数字转换成字符串

一.各种数字类型转换成字符串型:  public static void main(String[] args) { double value = 123456.123; String str = String.valueOf(value); // 其中 value 为任意一种数字类型. System.out.println("字符串str 的值: " + str); //字符串str 的值: 123456.123 } 二.字符串型转换成各种数字类型: public static vo

将数字转化为字符串的快捷方式

1.将数字转化为字符串的快捷方式 2.请彻底抛弃float类型,使用CGFloat或double,float不够精确. BOOL b1 = YES; BOOL b2 = NO; NSInteger t1 = 100000; int t2 = 200000; float t3 = 300000.02; CGFloat t33 = 300000.02; double t4 = 400000.0000003; NSNumber *num1 = @(123); NSNumber *num2 = @(12

Ajax请求php返回json对象数据中包含有数字索引和字符串索引,在for in循环中取出数据的顺序问题

//php中的数组数据格式 Array ( [all] => Array ( [title] => ALL [room_promotion_id] => all ) [best_available_rate] => Array ( [title] => Best Available Rate [room_promotion_id] => best_available_rate ) [30] => Array ( [room_promotion_id] =>