作为子字符串呈现在单词中的字符串数目

签到题,枚举、统计即可。

class Solution {    public int numOfStrings(String[] patterns, String word) {        int cnt = 0;        for (String p : patterns) {            if (word.contains(p)) {                cnt++;            }        }        return cnt;    }}

结构元素不等于两相邻元素平均值的数组

依照一大一小的程序重排数组即可,这样一个数字相邻的数字要么都比它大,要么都比它小。

class Solution {    public int[] rearrangeArray(int[] nums) {        Arrays.sort(nums);        LinkedList<Integer> list = new LinkedList<>();        for (int num : nums) {            list.add(num);        }        int[] res = new int[nums.length];        for (int i = 0; i < res.length; i++) {            if (i % 2 == 0) {                res[i] = list.pollFirst();            } else {                res[i] = list.pollLast();            }        }        return res;    }}

数组元素的最小非零乘积

最终肯定是若干个 1、1 个 $2^p - 1$、若干个 $2^p - 2$,并且 $2^p - 2$ 的数量和 1 的数量相等。

即最终后果是 $(2^p - 2)^{(2^{p-1} - 1)} * (2^p - 1)$

应用疾速幂计算即可。

class Solution {    public int minNonZeroProduct(int p) {        if (p == 1) {            return 1;        }        // 2^(p-1) - 1 个 1        // (2^p - 2)^(2^(p-1) - 1) * (2^p - 1)        long mod = (long) 1e9 + 7;        long a = (pow(2, p, mod) + mod - 2) % mod;        a = pow2(a, 2, p - 1, 1, mod);        long c = (pow(2, p, mod) + mod - 1) % mod;        return (int) (a * c % mod);    }    private long pow2(long a, long x, long y, long z, long mod) {        // calc a^(x^y - z) % mod        // x = 2, z = 1 or 0        if (y <= 2) {            long p = pow(x, y, mod) - z;            return pow(a, p, mod);        }        if (z == 0) {            return pow(pow2(a, x, y - 1, z, mod), 2, mod);        } else {            long t = pow2(a, x, y - 1, z, mod);            long t2 = pow2(a, x, y - 1, z - 1, mod);            return t * t2 % mod;        }    }    long pow(long a, long b, long p) {        if (b == 0) {            return 1;        }        if (b == 1) {            return a % p;        }        long t = pow(a, b / 2, p);        t = t * t % p;        if (b % 2 == 0) {            return t;        }        return t * a % p;    }}

你能穿过矩阵的最初一天

二分答案,而后 BFS 判断可达性。

class Solution {    public int latestDayToCross(int row, int col, int[][] cells) {        int l = 0, r = cells.length;        while (l + 1 < r) {            int m = (l + r) / 2;            if (check(row, col, cells, m)) {                l = m;            } else {                r = m;            }        }        return check(row, col, cells, r) ? r : l;    }    private boolean check(int row, int col, int[][] cells, int m) {        final int[] dx = {0, 0, 1, -1};        final int[] dy = {1, -1, 0, 0};        boolean[][] mp = new boolean[row][col];        for (int i = 0; i < m; i++) {            int[] cell = cells[i];            mp[cell[0] - 1][cell[1] - 1] = true;        }        boolean[][] vis = new boolean[row][col];        Queue<Integer> queue = new LinkedList<>();        for (int i = 0; i < col; i++) {            if (!mp[0][i]) {                queue.add(0);                queue.add(i);                vis[0][i] = true;            }        }        while (!queue.isEmpty()) {            int x = queue.poll();            int y = queue.poll();            if (x == row - 1) {                return true;            }            for (int i = 0; i < 4; i++) {                int nx = x + dx[i];                int ny = y + dy[i];                if (nx < 0 || ny < 0 || nx >= row || ny >= col || mp[nx][ny] || vis[nx][ny]) {                    continue;                }                vis[nx][ny] = true;                queue.add(nx);                queue.add(ny);            }        }        return false;    }}