2413. 最小偶倍数
给你一个正整数 n ,返回 2 和_ _n 的最小公倍数(正整数)。
示例 1:
输入:n = 5 输出:10 解释:5 和 2 的最小公倍数是 10 。
示例 2:
输入:n = 6 输出:6 解释:6 和 2 的最小公倍数是 6 。注意数字会是它自身的倍数。
提示:
- 1 <= n <= 150
思路:数学
class Solution {public int smallestEvenMultiple(int n) {if (n % 2 == 0) return n;else return n * 2;}}
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 由小写英文字母组成
思路:模拟
class Solution {public int longestContinuousSubstring(String s) {int max = 0;for (int i = 0; i < s.length(); i++) {int j = i + 1;while (j < s.length() && s.charAt(j) - 1 == s.charAt(j - 1))j++;max = Math.max(max, j - i);i = j - 1;}return max;}}
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 是一棵 完美 二叉树
思路:想法不难,重点是怎么让代码更简洁
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/// dfsclass Solution {public TreeNode reverseOddLevels(TreeNode root) {dfs(root.left, root.right, 1);return root;}void dfs(TreeNode l, TreeNode r, int x) {if (l == null) return;if (x == 1) {int t = l.val;l.val = r.val;r.val = t;}dfs(l.left, r.right, x ^ 1);dfs(l.right, r.left, x ^ 1);}}
类似的问题还有: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
class Solution {public int[] sumPrefixScores(String[] words) {Map<Long, Integer> map = new HashMap<>();long p = 13331;for (int i = 0; i < words.length; i++) {long x = 0;for (int j = 0; j < words[i].length(); j++) {x = x * p + words[i].charAt(j);map.merge(x, 1, Integer::sum);}}int[] res = new int[words.length];for (int i = 0; i < words.length; i++) {int s = 0;long x = 0;for (int j = 0; j < words[i].length(); j++) {x = x * p + words[i].charAt(j);s += map.get(x);}res[i] = s;}return res;}}
class Solution {public int[] sumPrefixScores(String[] words) {Trie tr = new Trie();for (String s : words) tr.insert(s);int[] res = new int[words.length];for (int i = 0; i < res.length; i++) {res[i] = tr.query(words[i]);}return res;}}class Trie {class Node {Node[] son = new Node[26];int cnt;}Node root = new Node();void insert(String s) {Node p = root;for (int i = 0; i < s.length(); i++) {int idx = s.charAt(i) - 'a';if (p.son[idx] == null)p.son[idx] = new Node();p = p.son[idx];p.cnt++;}}int query(String s) {int res = 0;Node p = root;for (int i = 0; i < s.length(); i++) {int idx = s.charAt(i) - 'a';p = p.son[idx];res += p.cnt;}return res;}}
