题目地址

思路

  1. 把数据变成字符数组处理(这里也可以做取余操作处理)
  2. 核心思路近似斐波那契数列,当前字符c下标设为k的组合情况,取决于之前k-1,k-2的字符组合情况。这里和一般的斐波那契的不同在于f(n-2)是否可以和f(n-1)组成10~25之间的数,如果可以那么f(n)=f(n-1)+f(n-2)否则f(n)=f(n-1)
class Solution {
    public int translateNum(int num) {
        if (num < 0) return 0;
        Integer numInteger = new Integer(num);
        char[] array = numInteger.toString().toCharArray();
        return fib(array);

    }
    // f(n) = f(n-1) + f(n-2) 不过这里的f(n-2) 需要根据条件判断是否添加
    public int fib(char[] arrays) {

        if (arrays.length < 2) return 1;
        // 第一位只有一种情况
        int pre2 = 1;
        // 第二位如果可以和第一位组成0~25,则存在两种组法,否则就一种
        int pre1 = ifAdd(arrays,1) ? 2 : 1;
        if (arrays.length == 2) return pre1;
        int r =  0;

        for(int i = 2; i < arrays.length ; i++) {
	    // 判断是否可以和之前的字符组成10~25之间的数字 
            if (ifAdd(arrays,i)) {
                r = pre1 + pre2;
            } else {
                r = pre1;
            }
            pre2 = pre1;
            pre1 = r;
        }

        return r;

    }


    // 判断当前位置和之前的位置是否能组成一个字符,即是否范围在0~25之间
    public boolean ifAdd(char[] chars,int index) {
        if (index < 1 || index > chars.length - 1) return false;
        if(chars[index - 1] == '0')
            return false;
        if(chars[index - 1] > '2')
            return false;
        if(chars[index-1] == '2' && chars[index] > '5') return false;
        return true;
    } 
}

Q.E.D.


每一个平凡的日常都是连续的奇迹