算法:91. 解码方法

算法:91. 解码方法

题目

一条包含字母 A-Z 的消息通过以下映射进行了 编码 :

'A' -> 1
'B' -> 2
...
'Z' -> 26

要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,“111” 可以将 “1” 中的每个 “1” 映射为 “A” ,从而得到 “AAA” ,或者可以将 “11” 和 “1”(分别为 “K” 和 “A” )映射为 “KA” 。注意,“06” 不能映射为 “F” ,因为 “6” 和 “06” 不同。

给你一个只含数字的 非空 字符串 num ,请计算并返回 解码 方法的 总数 。

题目数据保证答案肯定是一个 32 位 的整数。

示例 1:

输入:s = "12"
输出:2
解释:它可以解码为 "AB"(1 2)或者 "L"(12)。

示例 2:

输入:s = "226"
输出:3
解释:它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。

示例 3:

输入:s = "0"
输出:0
解释:没有字符映射到以 0 开头的数字。含有 0 的有效映射是 'J' -> "10" 和 'T'-> "20" 。由于没有字符,因此没有有效的方法对此进行解码,因为所有数字都需要映射。

示例 4:

输入:s = "06"
输出:0
解释:"06" 不能映射到 "F" ,因为字符串开头的 0 无法指向一个有效的字符

提示:

1 <= s.length <= 100
s 只包含数字,并且可能包含前导零。

解法

这个问题可以转换为爬楼梯问题,而且是加了两个条件。
爬楼梯问题的动态规划公式为 dp[n] = dp[n - 1] + dp[n - 2].

  1. 要用dp[n] = dp[n - 1] + dp[n - 2]公式必须满足数字区间为11-19、21-26
  2. 如果是10,20,则退化为dp[n] = dp[n - 2];
  3. 如果是个位数不为0,则退化为dp[n] = dp[n - 1];
  4. 如果是30,40... 90,则返回-1.
class Solution {
    public int numDecodings(String s) {
        int n = s.length();
        if(n == 0) return 0;
        int[] dp = new int[n + 1];
        dp[0] = 1;
        dp[1] = s.charAt(0) == '0' ? 0 : 1;
        for(int i = 1; i < n; i++){
            
            if(s.charAt(i-1) == '1' || s.charAt(i-1) == '2' && s.charAt(i) <'7'){
                //如果是20、10
                if(s.charAt(i) == '0') dp[i + 1] = dp[i - 1];
                //如果是11-19、21-26
                else dp[i + 1] = dp[i] + dp[i - 1];
            }else if(s.charAt(i) == '0'){
                //如果是0、30、40、50
                return 0;
            }else{
                //i-1和i无法构成一个字母
                dp[i + 1] = dp[i];
            }
        }
        return dp[n];
    }
}

Read more

Nginx学习总结(10)——Nginx前后端分离将多个请求转发到多个Tomcat,负载均衡反向代理

Nginx学习总结(10)——Nginx前后端分离将多个请求转发到多个Tomcat,负载均衡反向代理

一、谈谈“渲染” 相信好多人都挺听过“渲染”这个词,但不清楚它是什么意思?前端开发以为这是后端的活儿,后端开发以为是前端的事儿,推着推着就不了了之。其实渲染很简单,不说概念,直接举例: 1、 后端渲染:以JSP为例,可以分成三步 a、编写标签或Java代码(可以称之为模板) b、在JSP编译阶段被转换成Servlet编译为Servlet Class c、执行编译后的代码,将响应(模板执行结果)返回给页面 优势:减少前端工作,前端只需要设计纯页面,其他的都由后端来做; 缺点:依赖于服务器端,增大服务器压力,前后端职责分工不明确; 应用场景:在页面不太多、渲染压力不大、服务器端能够承受范围内可以使用后端渲染。 2、 前端渲染:以基于js的模板引擎为例 a、编写模板代码 b、通过模板引擎将模板转化为脚本语言,拼接在JS中(第一次拼接,以后使用缓存)

By Ne0inhk
Netty学习总结(6)——Netty使用注意事项

Netty学习总结(6)——Netty使用注意事项

什么是netty? 1、Netty 采用了Reactor模型(异步非阻塞)取代Selector模式(同步非阻塞) Reactor模式是事件驱动的,有一个或多个并发输入源,有一个Service Handler,有多个Request Handlers;这个Service Handler会同步的将输入的请求(Event)多路复用的分发给相应的Request Handler,Request Handler的操作都是异步的,在此期间程序可以向下继续执行,而通过Future-Listener机制可以将相应的处理状态回调。 Reactor多线程模型 Reactor主从模型 主Reactor用于响应连接请求,从Reactor用于处理IO操作请求! 2、Netty的高效并发编程主要体现在如下几点: 1) volatile的大量、正确使用; 2) CAS和原子类的广泛使用; 3) 线程安全容器的使用; 4) 通过读写锁提升并发性能。 3、Netty除了使用reactor来提升性能,当然还有 1、零拷贝,IO性能优化 2、通信上的粘包拆包 2、同步的设计 3、高性能的序列

By Ne0inhk
Web应用的负载均衡、集群、高可用(HA)解决方案整理总结

Web应用的负载均衡、集群、高可用(HA)解决方案整理总结

一、涉及到的几个组件 1.1、apache     —— 它是Apache软件基金会的一个开放源代码的跨平台的网页服务器,属于老牌的web服务器了,支持基于Ip或者域名的虚拟主机,支持代理服务器,支持安全Socket层(SSL)等等,目前互联网主要使用它做静态资源服务器,也可以做代理服务器转发请求(如:图片链等),结合tomcat等servlet容器处理jsp。 1.2、ngnix     —— 俄罗斯人开发的一个高性能的 HTTP和反向代理服务器。由于Nginx 超越 Apache 的高性能和稳定性,使得国内使用 Nginx 作为 Web 服务器的网站也越来越多,其中包括新浪博客、新浪播客、网易新闻、腾讯网、搜狐博客等门户网站频道等,在3w以上的高并发环境下,ngnix处理能力相当于apache的10倍。     参考:apache和tomcat的性能分析和对比(http://blog.s135.com/nginx_php_v6/) 1.3、lvs

By Ne0inhk
项目管理学习总结(9)——史上最全互联网八大技术岗位详解

项目管理学习总结(9)——史上最全互联网八大技术岗位详解

互联网技术岗位详解,涉及到前段开发、后端开发、移动端开发、大数据、项目管理、测试、运维、技术管理等八大领域。 架构师 每个产品线都有架构师,在技术平台部门也需要技术平台的架构师。 架构师负责设计系统整体架构,从需求到设计的每个细节都要考虑到,把握整个项目,使设计的项目尽量效率高,开发容易,维护方便,升级简单。 1、架构分析:从功能性的需求中识别出需要增加的非功能性需求,好满足性能、可扩展、集成、安全、可运维、高可用、易部署、易更新。并且识别非功能型需求后,还要做技术选型、技术架构风险识别、技术实现工作量评估。 2、架构设计与实现:完成非功能性模块的架构设计、接口设计、代码实现,所以,需要的是有代码实现能力还要有架构思维的工程师,而不是画PPT的工程师。 3、业务架构设计与实现:需要对跨系统的接口进行识别、实现、维护,需要对能写成公共代码类库的进行分析、识别、接口设计、

By Ne0inhk