1 条题解
-
0
题目分析
问题本质
给定一个大数 (最多 位),找到距离 最近的 Handsome 数。Handsome 数的定义是相邻数位的奇偶性不同。
核心挑战
- 大数处理: 可达 ,无法枚举
- 多解情况:可能存在多个距离相同的解
- 构造约束:需要保证相邻数位奇偶性交替
关键观察
Handsome 数的结构特征
Handsome 数只有两种可能的奇偶模式:
- 模式A:奇偶奇偶...(从最高位开始)
- 模式B:偶奇偶奇...(从最高位开始)
距离最近的含义
需要找到:
- 比 大的最小 Handsome 数
- 比 小的最大 Handsome 数 然后比较哪个距离更近,或者都输出。
算法框架
步骤1:检查原数
首先检查 本身是否是 Handsome 数:
- 如果是,直接输出
- 否则继续寻找
步骤2:寻找最近的 Handsome 数
策略:从高位到低位找到第一个破坏奇偶交替的位置 ,然后在该位置进行调整。
具体过程:
- 定位违规位置:找到第一个位置 ,使得
digit[i]和digit[i+1]的奇偶性相同 - 分类处理:
- 情况1:尝试修复当前位,使其满足奇偶交替且尽量接近原数
- 情况2:如果无法修复,需要回溯到前一位调整
步骤3:构造候选解
比 大的最小 Handsome 数:
- 找到第一个可以增加的位置
- 在该位置尝试增加数字,使其满足奇偶交替
- 后续位用最小合法数字填充(保持奇偶交替)
比 小的最大 Handsome 数:
- 找到第一个可以减少的位置
- 在该位置尝试减少数字,使其满足奇偶交替
- 后续位用最大合法数字填充(保持奇偶交替)
详细算法
算法流程
- 输入处理:将 作为字符串读入
- 模式检测:确定原数应该遵循哪种奇偶模式
- 违规检测:找到第一个违反奇偶交替的位置
- 候选生成:
- 向上搜索:从违规位置开始,尝试增加数字得到更大的 Handsome 数
- 向下搜索:从违规位置开始,尝试减少数字得到更小的 Handsome 数
- 结果比较:计算两个候选解与 的距离,输出最近的解
特殊情况处理
全9数字:
- 如 ,比它大的最小 Handsome 数需要增加位数
- 如 比 大,需要检查 是否是 Handsome 数
全0数字:
- 如 ,比它小的最大 Handsome 数需要减少位数
- 如 比 小,需要检查 是否是 Handsome 数
边界情况:
- :输出 (本身就是 Handsome 数)
- :输出 和 (距离都是 )
构造技巧
最小填充策略
当确定前 位后,后续位使用最小合法数字填充:
- 如果上一位是奇数,下一位填最小偶数
- 如果上一位是偶数,下一位填最小奇数
最大填充策略
当确定前 位后,后续位使用最大合法数字填充:
- 如果上一位是奇数,下一位填最大偶数
- 如果上一位是偶数,下一位填最大奇数
复杂度分析
时间复杂度
- 检查原数:,其中 是数字长度
- 生成候选解:每个候选解需要 时间
- 总复杂度:
空间复杂度
- 存储数字字符串:
- 存储候选解:
实现细节
大数比较
由于数字可能很大,需要实现大数减法来计算距离:
- 将数字作为字符串处理
- 实现字符串形式的大数减法
- 比较绝对值大小
多解处理
当两个候选解距离相等时,按从小到大顺序输出:
- 先输出较小的数
- 再输出较大的数
回溯处理
如果当前位无法调整到合法状态,需要回溯到前一位:
- 前一位数字加1或减1
- 检查是否产生进位或借位
- 重新确定后续位的填充
总结
本题的核心在于通过贪心构造找到最近的合法数。关键思路是从高位到低位找到第一个违规位置,然后分别向上和向下搜索最近的 Handsome 数。需要注意处理大数运算和边界情况,以及多解情况的输出顺序。
- 1
信息
- ID
- 4275
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 6
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者