LeetCode 题解工作台
字符串中的最大奇数
给你一个字符串 num ,表示一个大整数。请你在字符串 num 的所有 非空子字符串 中找出 值最大的奇数 ,并以字符串形式返回。如果不存在奇数,则返回一个空字符串 "" 。 子字符串 是字符串中的一个连续的字符序列。 示例 1: 输入: num = "52" 输出: "5" 解释: 非空子字符串仅…
3
题型
6
代码语言
3
相关题
当前训练重点
简单 · 贪心·invariant
答案摘要
我们可以从后往前遍历字符串,找到第一个奇数,然后返回从开头到该奇数的子字符串即可。如果不存在奇数,则返回空字符串。 时间复杂度 ,其中 是字符串 的长度。忽略答案字符串的空间消耗,空间复杂度 。
Interview AiBoxInterview AiBox 实时 AI 助手,陪你讲清 贪心·invariant 题型思路
题目描述
给你一个字符串 num ,表示一个大整数。请你在字符串 num 的所有 非空子字符串 中找出 值最大的奇数 ,并以字符串形式返回。如果不存在奇数,则返回一个空字符串 "" 。
子字符串 是字符串中的一个连续的字符序列。
示例 1:
输入:num = "52" 输出:"5" 解释:非空子字符串仅有 "5"、"2" 和 "52" 。"5" 是其中唯一的奇数。
示例 2:
输入:num = "4206" 输出:"" 解释:在 "4206" 中不存在奇数。
示例 3:
输入:num = "35427" 输出:"35427" 解释:"35427" 本身就是一个奇数。
提示:
1 <= num.length <= 105num仅由数字组成且不含前导零
解题思路
方法一:逆序遍历
我们可以从后往前遍历字符串,找到第一个奇数,然后返回从开头到该奇数的子字符串即可。如果不存在奇数,则返回空字符串。
时间复杂度 ,其中 是字符串 的长度。忽略答案字符串的空间消耗,空间复杂度 。
class Solution:
def largestOddNumber(self, num: str) -> str:
for i in range(len(num) - 1, -1, -1):
if (int(num[i]) & 1) == 1:
return num[: i + 1]
return ''
复杂度分析
| 指标 | 值 |
|---|---|
| 时间 | O(n) |
| 空间 | O(1) |
面试官常问的追问
外企场景- question_mark
Asks about scanning from left vs right and why greedy works here
- question_mark
Mentions handling extremely long numeric strings efficiently
- question_mark
Probes understanding of odd/even digit significance for substring selection
常见陷阱
外企场景- error
Checking every possible substring leads to O(n^2) time complexity, which is unnecessary
- error
Returning the first odd digit from the start instead of the last may produce a smaller number
- error
Forgetting to return empty string when no odd digit exists
进阶变体
外企场景- arrow_right_alt
Find the smallest odd substring instead of the largest
- arrow_right_alt
Allow non-contiguous digits but still maximize odd value
- arrow_right_alt
Handle strings with leading zeros or negative signs