力扣---2020.4.18

面試題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;
    }
}

你知道的越多,你不知道的越多。
有道無術,術尚可求,有術無道,止於術。
如有其它問題,歡迎大家留言,我們一起討論,一起學習,一起進步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章