当前位置: 首页 > news >正文

第27天(简单题中等题 二分查找)

打卡第二十七天
2道中等题
image

题目:
image

思路1: 预处理所有的n位数起始数组 二分法查找合适区间 根据下标进行返回。
image

代码:

class Solution {
public:int findNthDigit(int n) {int digit = 1;//当前处理的数字位数(从1位数开始)long start = 1;//当前位数范围的起始数字(1位数从1开始)long count = 9;//当前位数范围内的总位数(1位数有9个数字×1位=9位)while (n > count) { // 如果n大于当前位数范围的总位数,说明目标在更高位数中n -= count;//减去当前范围的位数start *= 10;digit += 1;//移动到下一位数范围(start×10,digit+1)count = digit * start * 9;//计算新范围的位数:数字个数 × 位数}long num = start + (n - 1) / digit; // 计算具体的数字string s = to_string(num);//将数字转为字符串,如12→"12"return s[(n - 1) % digit] - '0'; // 计算在数字中的位置(从0开始)}                           //- '0':将字符转为数字
};

思路2: 二分查找
代码:

class Solution {
public:int findNthDigit(int n) {int low = 1, high = 9;//初始化二分查找的范围,low 和 high 表示数字的位数(1位数到9位数)while (low < high) {int mid = (high - low) / 2 + low;if (totalDigits(mid) < n) {//如果 mid 位数及以下的所有数字总位数小于 n,说明目标数字的位数更大low = mid + 1;} else {//目标数字的位数小于等于 midhigh = mid;}}int d = low;//找到目标数字所在的位数int prevDigits = totalDigits(d - 1);//计算所有位数小于 d 的数字的总位数int index = n - prevDigits - 1;//计算在 d 位数中的索引(从0开始)int start = (int) pow(10, d - 1);//d 位数的起始数字(如2位数从10开始)int num = start + index / d;//计算具体的数字:起始数字 + 索引除以位数int digitIndex = index % d;//计算数字中的第几位(从左边数)int digit = (num / (int) (pow(10, d - digitIndex - 1))) % 10;//除以 10^(d-digitIndex-1) 将目标数字移到个位,然后取模10得到个位数字return digit;}int totalDigits(int length) {int digits = 0;int curLength = 1, curCount = 9;while (curLength <= length) {digits += curLength * curCount;curLength++;curCount *= 10;}return digits;}
};

题目:
image

思路: 排序+二分查找
image
image
image
image

代码:

class Solution {
public:vector<int> findRightInterval(vector<vector<int>>& intervals) {unordered_map<int, int> starts_map;vector<int> starts;//存储所有区间的起始点for (int i = 0; i < intervals.size(); ++i) {starts_map[intervals[i][0]] = i;starts.push_back(intervals[i][0]);//将所有起始点存入数组}sort(starts.begin(), starts.end());//对起始点排序,便于二分查找vector<int> res;for (auto& interval : intervals) {int idx = higher_find(starts, interval[1]);//在排序后的starts中查找 ≥ 当前区间终点的最小起始点res.push_back(idx == -1 ? -1 : starts_map[starts[idx]]);//找到后通过starts_map找回原始索引}return res;}int higher_find(vector<int>& starts, int target) {if (target > starts[starts.size() - 1])//如果target比最大的起始点还大,说明没有右区间return -1;int left = 0;int right = starts.size() - 1;while (left < right) {//二分查找第一个 ≥ target 的位置int mid = left + (right - left) / 2;if (starts[mid] >= target) {right = mid;} else {left = mid + 1;}}return left;}
};

输出:
image

耗时≈1.5小时 明天继续

http://www.jsqmd.com/news/42187/

相关文章:

  • 题解:P14452 [ICPC 2025 Xian R] Follow the Penguins
  • Atcoder 432 A-F 总结+题解
  • 用 Rust 实现验证码识别
  • 结合前缀和进行差分数组的学习理解
  • Rust 实现验证码识别
  • 高安全性 PHP 2FA 开发指南:Authenticator 扫码验证实现方案
  • 20232417 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • Elixir 实现验证码识别
  • 2025 年空运物流公司推荐排行榜(广东地区重点推荐) 广州 / 深圳 / 佛山 / 东莞 ⇄ 澳洲 / 新西兰 / 悉尼 / 新加坡 / 墨尔本 空运专线物流公司推荐
  • 终结挑战的元回应 ——当问题本身成为答案的生成器
  • [学习笔记] JMM 汇总:从概念到底层原理
  • Python 3.14 实用技巧:10个让代码更清晰的小改进
  • 各组件证书配置文件yml
  • 模型管理与树形结构
  • 20232416 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 2025镇江、常州、无锡、苏州、高邮、濮阳、郑州、嘉兴、扬州物流公司推荐:2025地区物流/仓储/供应链/配送中心企业最新排行,江浙沪区域运输服务口碑榜
  • 【题解】AT_abc432_e [ABC432E] Clamp
  • WireWorld美国线世界中国企业代理资质结构化列表
  • 关于python的库的层级引用问题
  • jmeter查看天气/快递操作
  • 详细介绍:00x01.Vulnhub系列DC-1靶机渗透测试:从Drupal漏洞到Root权限的完整攻防
  • 详细介绍:MySQL——用户权限和管理
  • 完整教程:配置驱动开发:初探零代码构建嵌入式软件配置工具
  • 2025 年海运物流专线公司推荐排行榜(广东地区重点推荐) 广州 / 深圳 / 佛山 / 东莞 ⇄ 澳洲 / 加拿大 / 新西兰物流运输公司推荐
  • 【CSP-J 2025】T4 多边形 polygon 题解
  • 回退背包
  • Django F对象完全指南:数据库层面的字段操作
  • 如何计算一台服务器最大TCP连接数
  • module jdk.compiler does not “以” com.sun.tools.javac.processing” to unnamed module
  • nginx 响应html内容