首页 > 其他分享 >剑指Offer44 -- 思维

剑指Offer44 -- 思维

时间:2023-03-07 09:11:52浏览次数:44  
标签:补位 思维 数字 10 -- len 位数 100 Offer44

1. 题目描述

剑指 Offer 44. 数字序列中某一位的数字

2. 思路

完全借鉴的参考思路。补位思想。

首先,什么是(数字的)补位。
试想这么一种情况,所有数字的位数都相同,什么意思呢?例如:\(1,222\)
他们的位数是不相同的,\(1\) 是 \(1\) 位,\(222\) 是三位,我们可以通过添加前置 \(0\) 来使得他们的位数相同,注意 ,前置 \(0\) 不一定只能在位数小的一方添加,例如:
\(001\), \(222\)
\(0001\), \(0222\)
....
都是可行的

好了,现在我们知道了什么是补位,那么,如果所有数字都是经过补位且位数相同,假设位数为 \(len\),那么,想知道第 \(k\) 位所在的数字是什么,是非常非常简单的!
如果你不能立马想出来话,直接把这样 \(001\),\(002\),\(003\),\(004\),...,\(999\) 的数字看作是一个 \(1000\) 行,\(3\) 列的矩阵!
每个数字都代表一行,每个数的位数就是列数。通过 \(k/1000\),可以得到行,在 \(k\%3\),即可得到列。
当然,这里我们假设,数字是连续的,不会出现,\(1\) 完了就是 \(100\) 的情况,当然,题目条件就是这样的。
那么,现在我给你一个数字 \(k\),请你告诉我从左到右,从上到下,第 \(k\) 个位置的数字是是什么(假设最左上角的下标为\(0\))?
这在八数码问题应该碰到过了吧,它的下标就是 [\(k/1000\),\(k\%3\)]。

非常好,现在我们不仅知道什么是补位,而且还知道了在补位的情况下如何求得位置 \(k\) 所在位置(下标)处的数字是什么,剩下要做的,就是将原序列:
\(1\),\(2\),...\(100\),..... 补成一个位数相同的序列,当然,我们希望这个位数越少越好。
我们循环枚举位数 \(len\) 就可以了。

3. 代码

class Solution {
public:
    // 我们把 k 的类型改为 long,是因为 k 可能会溢出,当 len=10 时,虽然此时会失败,但是会溢出
    // 我们也可以将 len*pow(10, len) 改为 (long long)len*pow(10,len)
    int findNthDigit(long k) {
        for(int len = 1; len <= 10 ; len ++ ) {  // 枚举所有的位数
            if(k <= len * pow(10, len)) { // 长度为 len 的数字的位数之和
                return to_string(k / len)[k % len] - '0';
            }
            k += pow(10, len);  // 如果不够,补位,需要对前面的所有数字补位,
        }
        // 永远不会到这里
        return -1;
    }
};

4. 参考

神仙思路

评论区解释
最终步骤是获取到取某个数的第几位
如果所有数的位数相同都为i,在已知要取第k位的情况下,结果就是to_string(k / i)[k % i] - '0'
但是并不是所有数位数一样,比如说1、10、100分别是1、2、3位数,这时候我们就要想办法把它们变成位数相同的001、010、100。
由于前边较小的数数位增加了,相对的,要取的第k位也要增加。
由于我们数位i每增加一次就进行一次k的增加,所以可以视为只会有i-1和i位数,所以k每次增加的数=低于当前数位i的数字总个数pow(10, i) * 1。
这样,i * pow(10, i) > k成立时,表示所需数据就是i位,可以直接用to_string(k / i)[k % i] - '0'得出结果了

标签:补位,思维,数字,10,--,len,位数,100,Offer44
From: https://www.cnblogs.com/ALaterStart/p/17186877.html

相关文章

  • golang 升级 1.16.3 之后,编译报错 missing go.sum entry for module providing packag
    问题现象在开发机上升级到了最新golang1.16.3版本,在为一个基于golang1.13的历史项目添加excel依赖包后gogetgithub.com/360EntSecGroup-Skylar/excelize/v2......
  • 巧用 CSS 变量,实现动画函数复用,制作高级感拉满的网格动画
    本文将介绍一种基于CSS变量技巧,通过合理使用CSS变量,实现CSS动画@keyframes的复用。CSS变量CSS变量大家应该都比较熟悉了,已经不能算是新知识了,快速过一遍。CSS......
  • Selenium CHANGELOG[最新版本4.8.2 计划中]
    SeleniumCHANGELOG[持续更新]源文件https://github.com/SeleniumHQ/selenium/blob/trunk/py/CHANGES搬运工对重点版本做时间标注,具体时间点可以参考https://github.c......
  • java的反射
    1.获取class对象的三种方式Class.forName();类名.class实例对象.getClass();2.利用反射获取构造函数Constructor<?>[]getConstructor()返回所有公共构造方法......
  • websocket
    websocketWebSocket协议运行在TCP协议之上,与Http协议同属于应用层网络数据传输协议。WebSocket相比于Http协议最大的特点是:允许服务端主动向客户端推送数据。WebSocket......
  • 浅谈基于Web的跨平台桌面应用开发
    作者:京东物流王泽知近些年来,跨平台跨端一直是比较热门的话题,Writeonce,runanywhere,一直是我们开发者所期望的,跨平台方案的优势十分明显,对于开发者而言,可以做到一次开......
  • 通过预制体生成图片
      //图一效果 图二使用方法 拖入即可 或者给指定目录下对应预制体 usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;usingUnity......
  • MySQL中这14个必备神器,用过都说好
    前言:最近几年用MYSQL数据库挺多的,发现了一些非常有用的小玩意,今天拿出来分享到大家,希望对你会有所帮助。1.group_concat 在我们平常的工作中,使用groupby......
  • 三天吃透mybatis面试八股文
    本文已经收录到Github仓库,该仓库包含计算机基础、Java基础、多线程、JVM、数据库、Redis、Spring、Mybatis、SpringMVC、SpringBoot、分布式、微服务、设计模式、架构、校......
  • 三种拓扑的对比以及共性基础问题
    对于电感设计而言,最恶劣的电压定义为峰值电流达到最大值时所对应的输入电压,这是一般电感设计的基础,1.改变电感值是不会影响Idc2.改变开关电源频率是不会影响Idc的3.......