VP

2413. 最小偶倍数

给你一个正整数 n ,返回 2 和_ _n 的最小公倍数(正整数)。

示例 1:
输入:n = 5 输出:10 解释:5 和 2 的最小公倍数是 10 。
示例 2:
输入:n = 6 输出:6 解释:6 和 2 的最小公倍数是 6 。注意数字会是它自身的倍数。

提示:

  • 1 <= n <= 150


思路:数学

  1. class Solution {
  2. public int smallestEvenMultiple(int n) {
  3. if (n % 2 == 0) return n;
  4. else return n * 2;
  5. }
  6. }

2414. 最长的字母序连续子字符串的长度

显示英文描述
字母序连续字符串 是由字母表中连续字母组成的字符串。换句话说,字符串 “abcdefghijklmnopqrstuvwxyz” 的任意子字符串都是 字母序连续字符串

  • 例如,”abc” 是一个字母序连续字符串,而 “acb” 和 “za” 不是。

给你一个仅由小写英文字母组成的字符串 s ,返回其 最长 的 字母序连续子字符串 的长度。

示例 1:
输入:s = “abacaba” 输出:2 解释:共有 4 个不同的字母序连续子字符串 “a”、”b”、”c” 和 “ab” 。 “ab” 是最长的字母序连续子字符串。
示例 2:
输入:s = “abcde” 输出:5 解释:“abcde” 是最长的字母序连续子字符串。

提示:

  • 1 <= s.length <= 105
  • s 由小写英文字母组成

思路:模拟

  1. class Solution {
  2. public int longestContinuousSubstring(String s) {
  3. int max = 0;
  4. for (int i = 0; i < s.length(); i++) {
  5. int j = i + 1;
  6. while (j < s.length() && s.charAt(j) - 1 == s.charAt(j - 1))
  7. j++;
  8. max = Math.max(max, j - i);
  9. i = j - 1;
  10. }
  11. return max;
  12. }
  13. }

2415. 反转二叉树的奇数层

给你一棵 完美 二叉树的根节点 root ,请你反转这棵树中每个 奇数 层的节点值。

  • 例如,假设第 3 层的节点值是 [2,1,3,4,7,11,29,18] ,那么反转后它应该变成 [18,29,11,7,4,3,1,2] 。

反转后,返回树的根节点。
完美 二叉树需满足:二叉树的所有父节点都有两个子节点,且所有叶子节点都在同一层。
节点的 层数 等于该节点到根节点之间的边数。

示例 1:
输入:root = [2,3,5,8,13,21,34] 输出:[2,5,3,8,13,21,34] 解释: 这棵树只有一个奇数层。 在第 1 层的节点分别是 3、5 ,反转后为 5、3 。
示例 2:
输入:root = [7,13,11] 输出:[7,11,13] 解释: 在第 1 层的节点分别是 13、11 ,反转后为 11、13 。
示例 3:
输入:root = [0,1,2,0,0,0,0,1,1,1,1,2,2,2,2] 输出:[0,2,1,0,0,0,0,2,2,2,2,1,1,1,1] 解释:奇数层由非零值组成。 在第 1 层的节点分别是 1、2 ,反转后为 2、1 。 在第 3 层的节点分别是 1、1、1、1、2、2、2、2 ,反转后为 2、2、2、2、1、1、1、1 。

提示:

  • 树中的节点数目在范围 [1, 214] 内
  • 0 <= Node.val <= 105
  • root 是一棵 完美 二叉树

思路:想法不难,重点是怎么让代码更简洁

  1. /**
  2. * Definition for a binary tree node.
  3. * public class TreeNode {
  4. * int val;
  5. * TreeNode left;
  6. * TreeNode right;
  7. * TreeNode() {}
  8. * TreeNode(int val) { this.val = val; }
  9. * TreeNode(int val, TreeNode left, TreeNode right) {
  10. * this.val = val;
  11. * this.left = left;
  12. * this.right = right;
  13. * }
  14. * }
  15. */
  16. // dfs
  17. class Solution {
  18. public TreeNode reverseOddLevels(TreeNode root) {
  19. dfs(root.left, root.right, 1);
  20. return root;
  21. }
  22. void dfs(TreeNode l, TreeNode r, int x) {
  23. if (l == null) return;
  24. if (x == 1) {
  25. int t = l.val;
  26. l.val = r.val;
  27. r.val = t;
  28. }
  29. dfs(l.left, r.right, x ^ 1);
  30. dfs(l.right, r.left, x ^ 1);
  31. }
  32. }

类似的问题还有:101. 对称二叉树

2416. 字符串的前缀分数和

给你一个长度为 n 的数组 words ,该数组由 非空 字符串组成。
定义字符串 word 的 分数 等于以 word 作为 前缀 的 words[i] 的数目。

  • 例如,如果 words = [“a”, “ab”, “abc”, “cab”] ,那么 “ab” 的分数是 2 ,因为 “ab” 是 “ab” 和 “abc” 的一个前缀。

返回一个长度为 _n 的数组 answer ,其中 answer[i] words[i] 的每个非空前缀的分数 总和 。_
注意:字符串视作它自身的一个前缀。

示例 1:
输入:words = [“abc”,”ab”,”bc”,”b”] 输出:[5,4,3,2] 解释:对应每个字符串的答案如下: - “abc” 有 3 个前缀:”a”、”ab” 和 “abc” 。 - 2 个字符串的前缀为 “a” ,2 个字符串的前缀为 “ab” ,1 个字符串的前缀为 “abc” 。 总计 answer[0] = 2 + 2 + 1 = 5 。 - “ab” 有 2 个前缀:”a” 和 “ab” 。 - 2 个字符串的前缀为 “a” ,2 个字符串的前缀为 “ab” 。 总计 answer[1] = 2 + 2 = 4 。 - “bc” 有 2 个前缀:”b” 和 “bc” 。 - 2 个字符串的前缀为 “b” ,1 个字符串的前缀为 “bc” 。 总计 answer[2] = 2 + 1 = 3 。 - “b” 有 1 个前缀:”b”。 - 2 个字符串的前缀为 “b” 。 总计 answer[3] = 2 。
示例 2:
输入:words = [“abcd”] 输出:[4] 解释: “abcd” 有 4 个前缀 “a”、”ab”、”abc” 和 “abcd”。 每个前缀的分数都是 1 ,总计 answer[0] = 1 + 1 + 1 + 1 = 4 。

提示:

  • 1 <= words.length <= 1000
  • 1 <= words[i].length <= 1000
  • words[i] 由小写英文字母组成

思路:
方法1:字符串哈希
方法2:Trie

  1. class Solution {
  2. public int[] sumPrefixScores(String[] words) {
  3. Map<Long, Integer> map = new HashMap<>();
  4. long p = 13331;
  5. for (int i = 0; i < words.length; i++) {
  6. long x = 0;
  7. for (int j = 0; j < words[i].length(); j++) {
  8. x = x * p + words[i].charAt(j);
  9. map.merge(x, 1, Integer::sum);
  10. }
  11. }
  12. int[] res = new int[words.length];
  13. for (int i = 0; i < words.length; i++) {
  14. int s = 0;
  15. long x = 0;
  16. for (int j = 0; j < words[i].length(); j++) {
  17. x = x * p + words[i].charAt(j);
  18. s += map.get(x);
  19. }
  20. res[i] = s;
  21. }
  22. return res;
  23. }
  24. }
  1. class Solution {
  2. public int[] sumPrefixScores(String[] words) {
  3. Trie tr = new Trie();
  4. for (String s : words) tr.insert(s);
  5. int[] res = new int[words.length];
  6. for (int i = 0; i < res.length; i++) {
  7. res[i] = tr.query(words[i]);
  8. }
  9. return res;
  10. }
  11. }
  12. class Trie {
  13. class Node {
  14. Node[] son = new Node[26];
  15. int cnt;
  16. }
  17. Node root = new Node();
  18. void insert(String s) {
  19. Node p = root;
  20. for (int i = 0; i < s.length(); i++) {
  21. int idx = s.charAt(i) - 'a';
  22. if (p.son[idx] == null)
  23. p.son[idx] = new Node();
  24. p = p.son[idx];
  25. p.cnt++;
  26. }
  27. }
  28. int query(String s) {
  29. int res = 0;
  30. Node p = root;
  31. for (int i = 0; i < s.length(); i++) {
  32. int idx = s.charAt(i) - 'a';
  33. p = p.son[idx];
  34. res += p.cnt;
  35. }
  36. return res;
  37. }
  38. }