阅读视图

发现新文章,点击刷新页面。

788. 旋转数字:动态规划

动归数组d,d[i]表示数字i的状态。

d[i]对应有三个值,1是好数,0是普数,-1是坏数。

好数是旋转后不同的数比如(2,5,6,9),普数是旋转以后相同的数如(0,1,8),坏数是旋转后不能成立的数如(3,4,7),这里前十个数的好坏情况通过切片给预处理了。

某数字i末位或末位以外的数字为坏数,数字i就肯定是坏数,例如(897,389,941)等等。

如果数字i不是坏数,那只要末位或末位以外的数字存在好数,那数字i就肯定是好数,如(120,886,509)等等就是好数,如(808,880)就是普数,程序这里计算用了按位或"|"。

如果数字i的结果d[i]是1是好数,那总答案就加1。

主要是末位以外的数字在计算该数字前肯定计算过了,所以可以动归。

class Solution:
    def rotatedDigits(self, N: int) -> int:
        ans = 0
        d = [0, 0, 1, -1, -1, 1, 1, -1, 0, 1] + [0] * (N - 9)
        for i in range(N + 1):
            if d[i // 10] == -1 or d[i % 10] == -1:
                d[i] = -1
            elif d[i // 10] == 1 or d[i % 10] == 1:
                d[i] = 1
                ans += 1
        return ans
class Solution:
    def rotatedDigits(self, N: int) -> int:
        ans, d = 0, [0, 0, 1, -1, -1, 1, 1, -1, 0, 1] + [0] * (N - 9)
        for i in range(N + 1):
            d[i] = -1 in (d[i // 10], d[i % 10]) and -1 or d[i // 10] | d[i % 10]
            ans += d[i] == 1
        return ans
func rotatedDigits(N int) int {
    ans, d := 0, make([]int, N + 1)
    copy(d, []int{0, 0, 1, -1, -1, 1, 1, -1, 0, 1})
    for i := 0; i <= N; i++ {
        if d[i / 10] == -1 || d[i % 10] == -1 {
            d[i] = -1
        } else if d[i] = d[i / 10] | d[i % 10]; d[i] == 1 {
            ans++
        }
    }
    return ans
}
impl Solution {
    pub fn rotated_digits(n: i32) -> i32 {
        let mut d: Vec<i32> = vec![0, 0, 1, -1, -1, 1, 1, -1, 0, 1];
        d.extend(vec![0; (n - 9).max(0) as usize]);
        let mut ans = 0;
        for i in 0..=n as usize {
            d[i] = if d[i / 10] == -1 || d[i % 10] == -1 {-1} else {d[i / 10] | d[i % 10]};
            ans += if d[i] == 1 {1} else {0};
        }
        ans
    }
}
var rotatedDigits = function(N) {
    let ans = 0
    const d = [0, 0, 1, -1, -1, 1, 1, -1, 0, 1].concat(Array(Math.max(0, N - 9)).fill(0))
    for (let i = 0; i <= N; ++i) {
        if (d[Math.floor(i / 10)] == -1 || d[i % 10] == -1) {
            d[i] = -1
        } else if (d[Math.floor(i / 10)] == 1 || d[i % 10] == 1) {
            d[i] = 1
            ++ans
        }
    }
    return ans
};
function rotatedDigits(N: number): number {
    let ans: number = 0;
    let d: number[] = [0, 0, 1, -1, -1, 1, 1, -1, 0, 1, ...Array(Math.max(N - 9, 0)).fill(0)];
    for (let i of Array.from({length: N + 1}, (_, k) => k)) {
        let [j, k] = [Math.trunc(i / 10), i % 10];
        d[i] = (d[j] == -1 || d[k] == -1) && -1 || d[j] | d[k];
        ans += Number(d[i] == 1);
    }
    return ans
};

pyimage.png
goimage.png
rsimage.png
jsimage.png
tsimage.png

❌