面試題46. 把數字翻譯成字符串
class Solution {
public int translateNum(int num) {
String s = num + "";
int[] dp = new int[s.length()+2];
dp[0] = 1;
dp[1] = 1;
for(int i = 2;i < dp.length;i++){
char ch = s.charAt(i-2);
if((i+1<dp.length) && (ch == '1' || (ch == '2' && s.charAt(i-1)<='5'))){
dp[i] = dp[i-1] + dp[i-2];
}else{
dp[i] = dp[i-1];
}
}
return dp[dp.length-1];
}
}
class Solution {
public int translateNum(int num) {
if(num<=9)return 1;
int tail=num%100;
if(tail<=9||tail>=26)return translateNum(num/10);
else return translateNum(num/10)+translateNum(num/100);
}
}
class Solution {
public int translateNum(int num) {
int a = 1, b = 1, x, y = num % 10;
while(num != 0) {
num /= 10;
x = num % 10;
int tmp = 10 * x + y;
int c = (tmp >= 10 && tmp <= 25) ? a + b : a;
b = a;
a = c;
y = x;
}
return a;
}
}
面試題43. 1~n整數中1出現的次數
class Solution {
public int countDigitOne(int n) {
return f(n);
}
private int f(int n){
if(n<=0)return 0;
String s=String.valueOf(n);
int hight=s.charAt(0)-'0';
int pow=(int)Math.pow(10,s.length()-1);
int last=n-hight*pow;
if(hight==1)return f(pow-1)+last+1+f(last);
else return hight*f(pow-1)+pow+f(last);
}
}
class Solution {
public int countDigitOne(int n) {
if (n <= 0)
return 0;
int high = n, dig = 1;
while (high / 10 > 0) {
dig++;
high /= 10;
}
int pow = (int) Math.pow(10, dig - 1);
int low = n - high * pow;
if (high == 1)
return countDigitOne(pow - 1) + low + 1 + countDigitOne(low);
else
return pow + high * countDigitOne(pow - 1) + countDigitOne(low);
}
}
class Solution {
public int countDigitOne(int n) {
int count = 0;
long i = 1; // 從個位開始遍歷到最高位
while(n / i != 0) {
long high = n / (10 * i); // 高位
long cur = (n / i) % 10; // 當前位
long low = n - (n / i) * i;
if(cur == 0) {
count += high * i;
}else if(cur == 1) {
count += high * i + (low + 1);
}else {
count += (high + 1) * i;
}
i = i * 10;
}
return count;
}
}
你知道的越多,你不知道的越多。
有道無術,術尚可求,有術無道,止於術。
如有其它問題,歡迎大家留言,我們一起討論,一起學習,一起進步