栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

算法47-数字转换成对应的字母

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

算法47-数字转换成对应的字母

题目:

给定一个数字字符串,1可以转换成A,2转换成B,3 转换成C,10 转换成J…20转成成T,一次类推,返回有多少种转换的方法

分析:

根据提题意,当来到index[ i]的时候可以分成以下情况:

1 【i】==1,下一位不越界,当前i有两种方法

2 【i】==2 下一位不越界,且下一位值小于等于6,当前i有两种方法

3【i】在3-9之间 只有一种方法

4【i】==0,无法转换,返回失败

代码:

package main

import(
	"fmt"
)
//题目要求返回多少种方法,所以以下只在于归纳有多找中可能的分支,统计每一种分支的sum
//并没有也不需要真的去转换,有一下四种分支:i==0,i==1,i==2,i in 3-9
func process(str string,i int) int{
	if i==len(str){
		return 1
	}
	if str[i]==48{//0,单独面对0字符,返回0种   这个分支走不通
		return 0
	}
	if str[i]==49{//1  当前位置是1时,即自己可以转为A,也可以与后面数字转成J-S
		res:=process(str,i+1)
		if i+1
			res+=process(str,i+2)
		}
		return res
	}
	if str[i]==50 {//2  当前位置数字是2,并且后面数字小于等于6,可以自己组成B,或者与后面数字组成T-Z
		res:=process(str,i+1)
		if i+1
			res+=process(str,i+2)
		}
		return res
	}
	if int(str[i])>=51 && int(str[i])<=57{
		return process(str,i+1)
	}
	return 0
}

动态规划:

package main

import(
	"fmt"
)
//题目要求返回多少种方法,所以以下只在于归纳有多找中可能的分支,统计每一种分支的sum
//并没有也不需要真的去转换,有一下四种分支:i==0,i==1,i==2,i in 3-9
func process(str string,i int) int{
	if i==len(str){
		return 1
	}
	if str[i]==48{//0,单独面对0字符,返回0种   这个分支走不通
		return 0
	}
	if str[i]==49{//1  当前位置是1时,即自己可以转为A,也可以与后面数字转成J-S
		res:=process(str,i+1)
		if i+1
			res+=process(str,i+2)
		}
		return res
	}
	if str[i]==50 {//2  当前位置数字是2,并且后面数字小于等于6,可以自己组成B,或者与后面数字组成T-Z
		res:=process(str,i+1)
		if i+1
			res+=process(str,i+2)
		}
		return res
	}
	if int(str[i])>=51 && int(str[i])<=57{
		return process(str,i+1)
	}
	return 0
}
func process1(str string)int{
	dp:= []int{}
	n:=len(str)
	for i:=0;i<=n+1;i++{
		dp=append(dp,0)
	}
	dp[n]=1
	// dp[n+1]=1

	for i:=n-1;i>=0;i--{
		// fmt.Println(string(str[i]))
		// fmt.Printf("uiiiiiii  %vn",i)

		if  str[i]==50{//2
			res:=dp[i+1]
			if  i+1
				dp[i]=res+dp[i+2]
			}else{
				dp[i]=res
			}
		}
		if  str[i]==49{//1
			res:=dp[i+1]
			if i+1
				dp[i]=res+dp[i+2]
			}else{
				dp[i]=res
			}
			}
		if str[i]==48{//0
			dp[i]=0
		}
		if int(str[i])>=51 && int(str[i])<=57{
		dp[i]=dp[i+1]
		}
	}
	fmt.Println(dp)

	fmt.Println(dp[0])
	return dp[0]
}

func main(){
	str:="111234567891112131415161718192122232425262728293"

	fmt.Println(process(str,0))
	fmt.Println(process1(str))
	// fmt.Printf("%tn",int(str[4]))
	// fmt.Printf("%vn",int(str[len(str)-1]))


}

总结:

1,由上面递归可以推导出动态规划,动态规划只需要一维的数组就可以搞定

2,分析递归代码,当前位置的值依赖i+1和i+2 并且n的位置==1,退出动态规划数组由后往前填写

3,注意数字字符串的切片是uint8,转成int也是ascii,判断也必须是判断ascii相等

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1032938.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号