Leetcode_单周赛_326

6278. 统计能整除数字的位数

Leetcode_单周赛_326_第1张图片

代码

class Solution {
    public int countDigits(int num) {
        int ans = 0;
        for (int i = num; i > 0; i /= 10) {
            if (num % (i % 10) == 0) ans++;
        }
        return ans;
    }
}

6279. 数组乘积中的不同质因数数目

Leetcode_单周赛_326_第2张图片

代码1

因为单个数字最大是 1000,所以我们求出来 1000以内的所有素数,然后遍历数组,计算每个数的质因子即可

class Solution {
    public int distinctPrimeFactors(int[] nums) {
        int[] f = new int[1000];
        get_Primes(1000);
        for (int k = 0; k < nums.length; k++) {
            int t = nums[k];
            for (int i = 0; i < cnt && primes[i] <= t; i++) {
                int p = primes[i];
                while (t % p == 0 && t > 0) {
                    f[p] = 1;
                    t /= p;
                }
            }
        }
        
        int ans = 0;
        for (int i = 0; i < 1000; i++) if (f[i] == 1) ans++;
        return ans;
    }
    private int[] primes = new int[1000]; // 存储所有素数
    private int[] vis = new int[1005]; // 存储 i 是否被筛掉了
    private int cnt = 0; // 记录素数个数

    // 线性筛法求素数
    private void get_Primes (int n) {
        for (int i = 2; i <= n; i++) {
            if (vis[i] == 0) primes[cnt++] = i;

            for (int j = 0; primes[j] <= n / i; j++) {
                vis[primes[j] * i] = 1;
                if (i % primes[j] == 0) break;
            }
        }
    }
}

代码2

遍历分解质因子,用哈希表存起来即可

class Solution {
    public int distinctPrimeFactors(int[] nums) {
        HashSet<Integer> set = new HashSet<>();
        for (int n : nums) {
            for (int i = 2; i * i <= n; i++) {
                if (n % i == 0) {
                    set.add(i);
                    while (n % i == 0) n /= i;
                }
            }
            if (n > 1) set.add(n);
        }

        return set.size();
    }
}

你可能感兴趣的:(Leetcode,leetcode,算法,数据结构)