目录
1. 字符串转换整数 (atoi) ★★
2. 重复的DNA序列 ★★
3. 二叉树中的最大路径和 ★★★
🌟 每日一练刷题专栏 🌟
C/C++ 每日一练 专栏
Python 每日一练 专栏
Java 每日一练 专栏
请你来实现一个 myAtoi(string s)
函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi
函数)。
函数 myAtoi(string s)
的算法如下:
0
。必要时更改符号(从步骤 2 开始)。[−231, 231 − 1]
,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231
的整数应该被固定为 −231
,大于 231 − 1
的整数应该被固定为 231 − 1
。注意:
' '
。示例 1:
输入:s = "42" 输出:42 解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。 第 1 步:"42"(当前没有读入字符,因为没有前导空格) 第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+') 第 3 步:"42"(读入 "42") 解析得到整数 42 。 由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42 。
示例 2:
输入:s = " -42" 输出:-42 解释: 第 1 步:" -42"(读入前导空格,但忽视掉) 第 2 步:" -42"(读入 '-' 字符,所以结果应该是负数) 第 3 步:" -42"(读入 "42") 解析得到整数 -42 。 由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42 。
示例 3:
输入:s = "4193 with words" 输出:4193 解释: 第 1 步:"4193 with words"(当前没有读入字符,因为没有前导空格) 第 2 步:"4193 with words"(当前没有读入字符,因为这里不存在 '-' 或者 '+') 第 3 步:"4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止) 解析得到整数 4193 。 由于 "4193" 在范围 [-231, 231 - 1] 内,最终结果为 4193 。
示例 4:
输入:s = "words and 987" 输出:0 解释: 第 1 步:"words and 987"(当前没有读入字符,因为没有前导空格) 第 2 步:"words and 987"(当前没有读入字符,因为这里不存在 '-' 或者 '+') 第 3 步:"words and 987"(由于当前字符 'w' 不是一个数字,所以读入停止) 解析得到整数 0 ,因为没有读入任何数字。 由于 0 在范围 [-231, 231 - 1] 内,最终结果为 0 。
示例 5:
输入:s = "-91283472332" 输出:-2147483648 解释: 第 1 步:"-91283472332"(当前没有读入字符,因为没有前导空格) 第 2 步:"-91283472332"(读入 '-' 字符,所以结果应该是负数) 第 3 步:"-91283472332"(读入 "91283472332") 解析得到整数 -91283472332 。 由于 -91283472332 小于范围 [-2^31, 2^31 - 1] 的下界,最终结果被截断为 -2^31 = -2147483648 。
提示:
0 <= s.length <= 200
s
由英文字母(大写和小写)、数字(0-9
)、' '
、'+'
、'-'
和 '.'
组成代码:
class Solution {public int myAtoi(String s) {long y = 0;int i = 0;boolean w = false;boolean sign = false;int offset = 0;char[] ints = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };while (i < s.length()) {char c = s.charAt(i);boolean isSign = false;if (w == false && c != ' ') {w = true;if (c == '-') {sign = true;isSign = true;}if (c == '+') {isSign = true;}}if (w && (!isSign)) {int v = Arrays.binarySearch(ints, c);if (v < 0) {break;}y = y * 10 + v;if (y > 0x7FFFFFFF) {y = 0x7FFFFFFF;offset = 1;break;}}i++;}return sign ? -(int) (y + offset) : (int) y;}
}
所有 DNA 都由一系列缩写为 'A'
,'C'
,'G'
和 'T'
的核苷酸组成,例如:"ACGAATTCCG"
。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。
编写一个函数来找出所有目标子串,目标子串的长度为 10,且在 DNA 字符串 s
中出现次数超过一次。
示例 1:
输入:s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" 输出:["AAAAACCCCC","CCCCCAAAAA"]
示例 2:
输入:s = "AAAAAAAAAAAAA" 输出:["AAAAAAAAAA"]
提示:
0 <= s.length <= 10^5
s[i]
为 'A'
、'C'
、'G'
或 'T'
代码:
class Solution {public List findRepeatedDnaSequences(String s) {Set set = new HashSet<>();Set help = new HashSet<>();for (int i = 0; i <= s.length() - 10; i++) {String cur = s.substring(i, i + 10);if (!set.add(cur))help.add(cur);}return new ArrayList(help);}
}
路径 被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root
,返回其 最大路径和 。
示例 1:
输入:root = [1,2,3] 输出:6 解释:最优路径是 2 -> 1 -> 3 ,路径和为 2 + 1 + 3 = 6
示例 2:
输入:root = [-10,9,20,null,null,15,7] 输出:42 解释:最优路径是 15 -> 20 -> 7 ,路径和为 15 + 20 + 7 = 42
提示:
[1, 3 * 10^4]
-1000 <= Node.val <= 1000
代码: 递归法
class Solution {int maxSum = Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {maxGain(root);return maxSum;}public int maxGain(TreeNode node) {if (node == null) {return 0;}int leftGain = Math.max(maxGain(node.left), 0);int rightGain = Math.max(maxGain(node.right), 0);int priceNewpath = node.val + leftGain + rightGain;maxSum = Math.max(maxSum, priceNewpath);return node.val + Math.max(leftGain, rightGain);}
}
非递归法:
用栈来模拟递归过程,用哈希表存储每个节点的最大贡献值。首先将根节点入栈,然后在循环中不断弹出栈顶节点,如果该节点为空,我们将其最大贡献值设为0;如果该节点为叶子节点,将其最大贡献值设为节点值,并更新最大路径和;否则,计算左右子树的最大贡献值,并计算包含该节点的最大路径和,同样更新最大路径和,并将该节点的最大贡献值存入哈希表,同时将左右子节点入栈。最后返回最大路径和即可。
class Solution {int maxSum = Integer.MIN_VALUE;public int maxPathSum(TreeNode root) {Stack stack = new Stack<>();Map map = new HashMap<>();stack.push(root);while (!stack.isEmpty()) {TreeNode node = stack.pop();if (node == null) {map.put(node, 0);continue;}if (node.left == null && node.right == null) {map.put(node, node.val);maxSum = Math.max(maxSum, node.val);continue;}int leftGain = Math.max(map.getOrDefault(node.left, 0), 0);int rightGain = Math.max(map.getOrDefault(node.right, 0), 0);int priceNewpath = node.val + leftGain + rightGain;maxSum = Math.max(maxSum, priceNewpath);map.put(node, node.val + Math.max(leftGain, rightGain));stack.push(node.left);stack.push(node.right);}return maxSum;}
}
✨ 持续,努力奋斗做强刷题搬运工!
👍 点赞,你的认可是我坚持的动力!
🌟 收藏,你的青睐是我努力的方向!
✎ 评论,你的意见是我进步的财富!
| C/C++ 每日一练 专栏 |
| Python 每日一练 专栏 |
| Java 每日一练 专栏 |
![]() | Golang 每日一练 专栏 |