No.1
判断字符串的两半是否类似
解题思路
统计元音字母数量即可。
代码展现
class Solution {public boolean halvesAreAlike(String s) {int n = s.length();
int a = 0, b = 0;
for (int i = 0, j = n - 1; i < j; i++, j--) {a += "AEIOUaeiou".indexOf(s.charAt(i)) >= 0 ? 1 : 0;
b += "AEIOUaeiou".indexOf(s.charAt(j)) >= 0 ? 1 : 0;
}
return a == b;
}
}
No.2
吃苹果的最大数目
解题思路
贪婪的思路,咱们总是吃掉剩下的苹果中最先烂掉的。应用优先队列能够保护剩下的苹果哪些先烂掉。
代码展现
class Solution {
static class Apple {
int num;
int day;
public Apple(int num, int day) {
this.num = num;
this.day = day;
}
}
public int eatenApples(int[] apples, int[] days) {PriorityQueue<Apple> bucket = new PriorityQueue<>(Comparator.comparingInt(a -> a.day));
int res = 0;
for (int i = 0; i < apples.length; i++) {if (apples[i] > 0) {bucket.add(new Apple(apples[i], i + days[i]));
}
res += eat(bucket, i);
}
// 不再减少苹果,将剩下的吃完
for (int i = apples.length; !bucket.isEmpty(); i++) {res += eat(bucket, i);
}
return res;
}
// 在第 day 天吃苹果,返回能吃到的数量 (0 或 1)
private int eat(PriorityQueue<Apple> bucket, int day) {while (!bucket.isEmpty()) {Apple a = bucket.poll();
if (a.day <= day) {continue;}
if ((--a.num) > 0) {bucket.add(a);
}
return 1;
}
return 0;
}
}
No.3
球会落何处
解题思路
模仿球的着落即可。
代码展现
class Solution {public int[] findBall(int[][] grid) {int m = grid[0].length;
int[] res = new int[m];
for (int i = 0; i < m; i++) {res[i] = drop(0, i, grid);
}
return res;
}
private int drop(int x, int y, int[][] grid) {if (x == grid.length) {return y;}
if (grid[x][y] == 1 && (y == grid[0].length - 1 || grid[x][y + 1] == -1)) {return -1;}
if (grid[x][y] == -1 && (y == 0 || grid[x][y - 1] == 1)) {return -1;}
return drop(x + 1, y + grid[x][y], grid);
}
}
No.4
与数组中元素的最大异或值
解题思路
字典树。
咱们晓得,二进制数的异或运算的含意就是两者是否不同 —— 所以咱们在 Trie 树上尽可能走与以后位不同的那一条门路即可。
代码展现
class Solution {
class TrieNode {
int min; // 以后节点下最小的数
TrieNode[] child;
public TrieNode() {
min = Integer.MAX_VALUE;
child = new TrieNode[2];
}
}
public int[] maximizeXor(int[] nums, int[][] queries) {int min = Arrays.stream(nums).min().getAsInt();
// 初始化,建设一棵 32 层的 Trie 树
TrieNode root = new TrieNode();
for (int num : nums) {
TrieNode cur = root;
for (int m = 30; m >= 0; m--) {cur.min = Math.min(cur.min, num);
int d = (num >> m) & 1;
if (cur.child[d] == null) {cur.child[d] = new TrieNode();}
cur = cur.child[d];
cur.min = Math.min(cur.min, num);
}
}
// 求解
int[] res = new int[queries.length];
for (int i = 0; i < queries.length; i++) {if (queries[i][1] < min) {res[i] = -1;
continue;
}
TrieNode cur = root;
for (int m = 30; m >= 0 && cur != null; m--) {int xd = (queries[i][0] >> m) & 1; // 心愿往 xd ^ 1 的方向走
TrieNode except = cur.child[xd ^ 1];
if (except == null || except.min > queries[i][1]) {cur = cur.child[xd];
} else {cur = except;}
}
res[i] = cur == null || cur.min > queries[i][1] ? -1 : cur.min ^ queries[i][0];
}
return res;
}
}