44. 数字序列中某一位的数字

news2024/9/21 4:32:37

comments: true
difficulty: 中等
edit_url: https://github.com/doocs/leetcode/edit/main/lcof/%E9%9D%A2%E8%AF%95%E9%A2%9844.%20%E6%95%B0%E5%AD%97%E5%BA%8F%E5%88%97%E4%B8%AD%E6%9F%90%E4%B8%80%E4%BD%8D%E7%9A%84%E6%95%B0%E5%AD%97/README.md

面试题 44. 数字序列中某一位的数字

题目描述

数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从下标0开始计数)是5,第13位是1,第19位是4,等等。

请写一个函数,求任意第n位对应的数字。

 

示例 1:

输入:n = 3
输出:3

示例 2:

输入:n = 11
输出:0

 

限制:

  • 0 <= n < 2^31

注意:本题与主站 400 题相同:https://leetcode.cn/problems/nth-digit/

解法

方法一:数学

【LeetCode力扣刷题 | 剑指Offer题解合集 | 画解算法思路Python3或C++代码实现】 https://www.bilibili.com/video/BV1CK411c7gx/?p=39&share_source=copy_web&vd_source=ed4a51d52f6e5c9a2cb7def6fa64ad6a
在这里插入图片描述

位数为 k k k 的最小整数和最大整数分别为 1 0 k − 1 10^{k-1} 10k1 1 0 k − 1 10^k-1 10k1,因此 k k k 位数的总位数为 k × 9 × 1 0 k − 1 k \times 9 \times 10^{k-1} k×9×10k1

我们用 k k k 表示当前数字的位数,用 c n t cnt cnt 表示当前位数的数字的总数,初始时 k = 1 k=1 k=1, c n t = 9 cnt=9 cnt=9

每次将 n n n 减去 c n t × k cnt \times k cnt×k,当 n n n 小于等于 c n t × k cnt \times k cnt×k 时,说明 n n n 对应的数字在当前位数的数字范围内,此时可以计算出对应的数字。

具体做法是,首先计算出 n n n 对应的是当前位数的哪一个数字,然后计算出是该数字的第几位,从而得到该位上的数字。

时间复杂度 O ( log ⁡ 10 n ) O(\log_{10} n) O(log10n),空间复杂度 O ( 1 ) O(1) O(1)。其中 n n n 为给定的数字。

Python3
class Solution:
    def findNthDigit(self, n: int) -> int:
        k, cnt = 1, 9
        # 1) K:确定是 几位数
        while k * cnt < n: #9 9*10*2 9*100*3 ...
            n -= k * cnt
            k += 1
            cnt *= 10
        # 2)start: 10 ** (k - 1) -> 确定 几位数范围内 对应 具体那个数
        num = 10 ** (k - 1) + (n - 1) // k
		
		# 3)在具体那个数 中 取对应位的数
        idx = (n - 1) % k # 计算对应的位
        return int(str(num)[idx])
Java
class Solution {
    public int findNthDigit(int n) {
        int k = 1, cnt = 9;
        while ((long) k * cnt < n) {
            n -= k * cnt;
            ++k;
            cnt *= 10;
        }
        int num = (int) Math.pow(10, k - 1) + (n - 1) / k;
        int idx = (n - 1) % k;
        return String.valueOf(num).charAt(idx) - '0';
    }
}
C++
class Solution {
public:
    int findNthDigit(int n) {
        int k = 1, cnt = 9;
        while (1ll * k * cnt < n) {
            n -= k * cnt;
            ++k;
            cnt *= 10;
        }
        int num = pow(10, k - 1) + (n - 1) / k;
        int idx = (n - 1) % k;
        return to_string(num)[idx] - '0';
    }
};
Go
func findNthDigit(n int) int {
	k, cnt := 1, 9
	for k*cnt < n {
		n -= k * cnt
		k++
		cnt *= 10
	}
	num := int(math.Pow10(k-1)) + (n-1)/k
	idx := (n - 1) % k
	return int(strconv.Itoa(num)[idx] - '0')
}
JavaScript
/**
 * @param {number} n
 * @return {number}
 */
var findNthDigit = function (n) {
    let k = 1,
        cnt = 9;
    while (k * cnt < n) {
        n -= k * cnt;
        ++k;
        cnt *= 10;
    }
    const num = Math.pow(10, k - 1) + (n - 1) / k;
    const idx = (n - 1) % k;
    return num.toString()[idx];
};
C#
public class Solution {
    public int FindNthDigit(int n) {
        int k = 1, cnt = 9;
        while ((long) k * cnt < n) {
            n -= k * cnt;
            ++k;
            cnt *= 10;
        }
        int num = (int) Math.Pow(10, k - 1) + (n - 1) / k;
        int idx = (n - 1) % k;
        return num.ToString()[idx] - '0';
    }
}
Swift
class Solution {
    func findNthDigit(_ n: Int) -> Int {
        var n = n
        var k = 1
        var count = 9

        while k * count < n {
            n -= k * count
            k += 1
            count *= 10
        }

        let num = Int(Double(10).power(Double(k - 1))) + (n - 1) / k
        let idx = (n - 1) % k
        let numString = String(num)
        let char = numString[numString.index(numString.startIndex, offsetBy: idx)]

        return char.wholeNumberValue!
    }
}

extension Double {
    func power(_ exponent: Double) -> Double {
        return pow(self, exponent)
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2111751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

超越传统:Reflection 70B如何革新AI语言处理

Reflection 70B&#xff1a;AI语言模型的新里程碑&#x1f680; AI领域迎来了革命性的变革&#xff0c;HyperWrite公司推出的开源AI大模型Reflection 70B&#xff0c;以其卓越的性能在多个基准测试中超越了GPT-4o和Llama 3.1。这款基于Meta的Llama 3.1 70B Instruct构建的模型…

electron 客户端 windows linux(麒麟V10)多系统离线打包 最新版 <二>

这节主要讲解以下 linux系统&#xff08;国产麒麟&#xff09;下&#xff0c;electron如何配置打包。 第一&#xff0c; 下载二进制包 和windows的一样&#xff0c;还是下载二进制包。只不过是linux版本的&#xff0c;千万不要下错了。 地址&#xff1a;CNPM Binaries Mirro…

大型视觉语言模型的有效性评估

原文地址&#xff1a;https://arxiv.org/abs/2403.04306 摘要&#xff1a;大型视觉语言模型&#xff08;LVLM&#xff09;的出现代表了通用人工智能的探索取得了显着的进步。然而&#xff0c;该模型在专业和一般任务中的有效性值得进一步研究。本文致力于评估流行的 LVLM 分别在…

Leetcode面试经典150题-210.课程表II

这个题是图的问题&#xff0c;因为图的拓扑排序在实际应用中有非常多的用途图&#xff0c;所以最近考的越来越多 解法都在代码里&#xff0c;不懂就留言或者私信 看这个题之前一定要好好看看207题我写的题解&#xff0c;也许207看懂了的话&#xff0c;210只是一个coding问题了…

集成电路学习:什么是RTC实时时钟

一、RTC&#xff1a;实时时钟 RTC&#xff0c;即实时时钟&#xff08;Real-Time Clock&#xff09;&#xff0c;是一种能够在设备中持续运行并准确记录时间的电子组件。它广泛应用于计算机、手机、嵌入式系统、智能家居设备等多种场合&#xff0c;为这些设备提供精确的时间基准…

利用 Redis 实现延迟队列(点赞场景)

&#x1f308;点赞场景在前段时间有很多人都在争论&#xff0c;我也看了一些视频和文档&#xff0c;最后觉得b站技术的这篇写得很好 【点个赞吧】 - B站千亿级点赞系统服务架构设计 - 哔哩哔哩 &#x1f308;所以我也尝试用 Redis 的延迟队列来写一个点赞处理的 demo&#xff0…

iOS——通知协议代理

通知 概要 观察者和被观察者都无需知晓对方&#xff0c;只需要通过标记在NSNotificationCenter中找到监听该通知所对应的类&#xff0c;从而调用该类的方法。并且在NSNotificationCenter中&#xff0c;观察者可以只订阅某一特定的通知&#xff0c;并对其做出相应操作&#xf…

《论多源数据集成及应用》写作框架,软考高级系统架构设计师

论文真题 在如今信息爆炸的时代,企业、组织和个人面临着大量的数据。这些数据来自不同的渠道和资源,包括传感器、社交媒体、销售记录等,它们各自具有不同的数据格式、分布和存储方式。因此如何收集、整理和清洗数据,以建立一个一致、完整的数据集尤为重要。多源数据集成可…

Leetcode 700-二叉搜索树中的搜索

给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和一个整数值 val。 你需要在 BST 中找到节点值等于 val 的节点。 返回以该节点为根的子树。 如果节点不存在&#xff0c;则返回 null 。 题解 如果root.val>val&#xff0c;则搜索左子树&#xff0c;如果roo…

finalshell 4.5.x在m1mac闪退

使用过程中会出现突然闪退&#xff0c;尤其在定位生产打开一堆窗口的情况下&#xff0c;绝绝子 闪退崩溃日志&#xff1a; Thread 116 Crashed:: Java: pool-4-thread-28 0 libsystem_kernel.dylib 0x18e926600 __pthread_kill 8 1 libsystem_pthread.dyl…

基于opencv实现双目立体匹配点云距离

双目相机或两个单目相机。 一、相机标定 MATLAB软件&#xff0c;打开双目标定app。 点击add images&#xff0c;弹出加载图像的窗口&#xff0c;分别导入左图和右图&#xff0c;设置黑白格长度&#xff08;标定板的长度一般为20&#xff09;。 点击确定&#xff0c;弹出加载…

ArrayList,LinkedList

ArrayList集合 底层原理 1.利用空参创建的集合&#xff0c;在底层创建一个默认长度为0的数组 2.添加第一个元素时&#xff0c;底层会创建一个新的长度为10的数组 3.存满时&#xff0c;会扩容1.5倍 4.如果一次添加多个元素&#xff0c;1.5倍还放不下&#xff0c;则新创建数…

【C++】list的使用与简单模拟实现

目录 1、list的介绍和使用&#xff1a; 1、结构&#xff1a; 2、接口函数&#xff1a; 迭代器遍历&#xff1a; 增删查改&#xff1a; 翻转与排序&#xff1a; 2、list的模拟实现&#xff1a; 1、节点的封装&#xff1a; 2、迭代器的封装&#xff1a; 3、list的模拟实…

Flutter中自定义气泡框效果的实现

在用户界面的设计中&#xff0c;气泡框&#xff08;Bubble&#xff09;是一种非常有效的视觉工具&#xff0c;它可以用来突出显示信息或提示用户。气泡框广泛应用于聊天应用、通知提示等场景。在 Flutter 中&#xff0c;虽然有很多现成的气泡框组件&#xff0c;但如果你想要更多…

关于 ubuntu系统install的cmake版本较低无法编译项目升级其版本 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/141933927 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

django摄影竞赛小程序论文源码调试讲解

2系统关键技术及工具简介 系统开发过程中设计的关键技术是系统的核心&#xff0c;而开发工具则会影响的项目开发的进程和效率。第二部分便描述了系统的设计与实现等相关开发工具。 2.1 Python简介 Python 属于一个高层次的脚本语言&#xff0c;以解释性&#xff0c;编译性&am…

Android Studio调试Flutter项目

run运行项目中途&#xff0c;点击Flutter Attach 等一会就可以调试&#xff01; 或者&#xff0c;直接Debug允行项目。

C++相关概念和易错语法(32)(单例模式、类型转换)

1.单例模式 &#xff08;1&#xff09;设计模式是什么&#xff1f; 简单来说&#xff0c;被反复使用&#xff0c;多数人知晓、经过分类的代码设计经验的总结就叫设计模式&#xff0c;它建立在特殊类的设计之上&#xff0c;实现特殊的功能&#xff0c;运用的知识也十分综合。如…

协议集合(学习笔记)

按照数据的传送方式&#xff0c;通信协议可分为以下2种。 串行通信&#xff1a;串行&#xff08;Serial&#xff09;指的是逐个传输数据位&#xff0c;一次只传输一个位。 并行通信&#xff1a;并行&#xff08;Parallel&#xff09;指的是同时传输多个数据位&#xff0c;一次…

VMware 中 kali Linux的安装与使用

文章目录 前言 一、安装虚拟机 二、使用步骤 总结 前言 随着信息技术的飞速发展&#xff0c;虚拟化技术已经成为现代企业和个人用户不可或缺的一部分。通过虚拟化技术&#xff0c;我们可以在一台物理计算机上运行多个独立的操作系统和应用程序&#xff0c;从而实现资源的高效利…