思路
- 把数据变成字符数组处理(这里也可以做取余操作处理)
- 核心思路近似斐波那契数列,当前字符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.