作为子字符串呈现在单词中的字符串数目
签到题,枚举、统计即可。
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; }}