面试题四十六:把数字翻译成字符串
0变a ,1变b,25变z 。即一个字符串可以变成多种形式,请计算一共有多少种
方法一:递归分解
int TranFrom1(int n) { if(n<0) return 0; if(n/10==0) return 1; int k=0; k+=TranFrom1(n/10); if(n%100<=25&&n%100>=10) { k+=TranFrom1(n/100); } return k; }
方法二:动态规划,自下而上
int GetTranslationCount(int num) { if(num < 0) return 0; String number = Integer.toString(num); int length = number.length(); int[] counts = new int[length]; int count = 0; for(int i = length - 1; i >= 0; --i) { count = 0; if(i < length - 1)//非最后 count = counts[i + 1]; //当前位置可以走一位数 else count = 1; if(i < length - 1)//非最后一位 { int digit1 = number.charAt(i) - '0'; int digit2 = number.charAt(i+1) - '0'; int converted = digit1 * 10 + digit2; if(converted >= 10 && converted <= 25) //判断能否走两位数 { if(i < length - 2) count += counts[i + 2]; else count += 1; } } counts[i] = count; //记录当前可能的和 } count = counts[0]; return count; }
浪波激泥