46_剑指offer_java_把数字翻译成字符串

本文介绍了一个数字翻译成字符串的问题,给定一个数字,按照规则将其翻译成对应的字符串,如0翻译成'a',1翻译成'b',直到25翻译成'z'。讨论了如何计算一个数字的不同翻译方法,并提供了动态规划的解题思路和代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

 

题目描述

测试用例

题目考点

解题思路

参考解题


题目描述

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

 

测试用例

  • 功能测试(只有一位数字;包含多位数字)
  • 特殊输入测试(输入的数字字符串指针为空指针)

 

题目考点

  • 考察应聘者分析问题的能力。应聘者能够从问题中分析出递归的表达式[f(i)=f(i-1) + g(i,i-1)f(i-2)]是解决这个问题的关键。
  • 考察应聘者对递归及时间效率的理解。面试官期待应聘者能够用基于循环的代码(动态规划)来避免不必要的重复计算。

 

解题思路

动态规划

dp[i]:  表示从头到字符串的第i位(不是字符串的下标,而是真实的第几位,从1开始。令dp[0] = 1),一共有dp[i]种解码方法

1、首先我们一定能从第i-1位的解码方法上继续解码。那么就是dp[i] += dp[i-1];

2、除此之外如果字符串的第i-1位和第i位能组成一个10到25的数字,说明我们可以是在第i-2位的解码方法上继续解码。那么就是dp[i] += dp[i-2];

3、最后返回结果,dp[s.length()]

 

参考解题

package Sword;
/**
 * 数字翻译成字符串
 * @author tyler
 *
 */

public class numDecoding {
	// 动态规划
	
	public int numDecodings(String s) {
		// 异常
		if((s == null) || (s.length() == 0)) {
			return 0;
		}
		
		// 存储动态规划中间值
		int[] dp = new int[s.length() + 1];
		
		// 为了dp[2] += dp[0];
		dp[0] = 1;
		dp[1] = 1;
		
		for (int i = 2; i <= s.length(); ++i) {
			// 1、肯定会发生
			dp[i] += dp[i - 1];
			
			// 2、当前位与前一位可以组成一个数字
			if (Integer.parseInt(s.substring(i - 1, i)) >= 10 && Integer.parseInt(s.substring(i - 1, i)) <= 25) {
				//parseInt(String s), 将字符串参数解析为带符号的十进制整数。
				
				dp[i] += dp[i - 2]; 
			}
			
		}
		
		return dp[s.length()];
	}
	
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值