Thursday, November 15, 2018

902. Numbers At Most N Given Digit Set


对我来说很难的一道题
分两种情况讨论
1. 组成的数的位数少于 N,那么就是 choices的permutation -> digit^choices
2. 组成的数的位数恰好等于N
-> 此时需要从最高位开始比较
如果d小于 N的最高位,那么以d为最高位的所有数都符合,
    +(totalDigits - 1)^choices
如果d大于N的最高位,那么以后的所有都不符合了,可以直接return sum
如果d恰好等于N的最高位,那么需要讨论第 2 高位,重复以上的3 steps

难点在于当把 D的 d都看过之后如何判断还要不要往下一位继续看,只有当前位有相等情况时才向下一位继续看



100.00 %
class Solution {
    public int atMostNGivenDigitSet(String[] D, int N) {
        String x = String.valueOf(N);
        int totalDigits = x.length();
        int sum = 0;
        int choices = D.length;
        for (int digits = 1; digits < totalDigits; digits++) {
            sum += Math.pow(choices, digits);
        }
        boolean isPrefix = false;
        int i = 0;
        for (i = 0; i < x.length(); i++) {
            isPrefix = false;
            char currDigit = x.charAt(i);
            for (String d : D) {
                char c = d.charAt(0);
                if (c < currDigit) {
                    sum += Math.pow(choices, totalDigits - i - 1);
                } else if (c == currDigit) {
                    isPrefix = true;
                    break;
                }
            }
            if (!isPrefix) {
                return sum;
            }
        }
       
        return sum + (isPrefix ? 1 : 0);
    }
}

Edge Cases:
["1"] 834

["3","4","8"] 4


No comments:

Post a Comment