【数学知识】剑指 Offer 44. 数字序列中某一位的数字

本问题对应课程链接:剑指offer刷题第四期

要求:

1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。
2、给出你代码所用的时间复杂度和空间复杂度

共以下 9 个回答

  • hi 普通 2023年8月22日 上午8:21
    1. 确定是几位数
    2. 确定是几位数中的第几位
    3. 属于那个数的第几位
    class Solution {
    public:
        int findNthDigit(int n) {
            //确定是几位数
            long long i = 1, s = 9, base = 1;
            while(n > s * i){
                n -= s * i;
                i ++;
                s *= 10;
                base *= 10;
            }
            //确定是几位数中的第几位
            int number = base + (n + i - 1) / i - 1;
            //属于那个数的第几位
            int r = n % i ? n % i : i;
            for(int j = 0; j < i - r; j ++) number /= 10; //n 与 number别弄错了
            return number % 10;
        }
    };
    
    0 赞同 0 条回复
  •  普通 2023年8月7日 下午11:12

    c++ 代码
    class Solution {
    public:
    int findNthDigit(int n)
    {
    int i=1;
    while(n>9pow(10,i-1)i)
    {
    n=n-9pow(10,i-1)i;
    i++;
    }
    int min=pow(10,i-1);
    int cur=min+(n-1)/i;
    int cur_digit=(n-1)%i;
    string s=to_string(cur);
    return s[cur_digit]-‘0’;
    }
    };

    0 赞同 0 条回复
  • 北辰 普通 2023年8月4日 上午10:45
    class Solution {
        public int findNthDigit(int n) {
          int level = check(n);
            int sum=0;
            for(int i=1;i<=level-1;i++) {
                if(i==1) sum+=10;
                else {
                    sum+=(9*Math.pow(10, i-1))*i;
                }
            }
            if(level==1) {
                return n;
            }else {
                int base = (int) Math.pow(10, level-1);
                //num就是要找的那个数
                int num = (int) (base+(n-sum)/level);
                //需要找这个数的第几位,从左往右数
                int weishu = (n-sum)%level;
                return Integer.valueOf(String.valueOf(num).charAt(weishu)-'0');
            }
        }
    
        public int check(int n) {
            long sum = 0;
            int ans = 0;
            for(int i=1;i<=10;i++) {
                if(i==1) sum+=10;
                else {
                    sum+=(9*Math.pow(10, i-1))*i;
                }
                if(sum>n) {
                    ans = i;
                    break;
                }
            }
            return ans;
        }
    }
    
    0 赞同 0 条回复
  • #00456B 普通 2023年8月2日 下午11:21
    class Solution {
    public:
        int findNthDigit(int n) {
            //base是10的倍数,i表示这个区间的数有几位
            //base      i       范围     数量       字符数量
            //base = 1, i = 1, [0-9],    9,        9x1 = 9
            //base = 10, i = 2,[10-99],  90,       90x2 = 180
            //base = 100, i = 3, [100-999], 900,   900x3 = 2700
            //base = 1000, i = 4, [1000-9999], 9000, 9000x4 = 36000
            //....
            //先找到n在哪个区间内,再找到具体的数字,最后找到是第几位
            long base = 1;
            int i = 1;
            long cur = 9;//表示当前区间有多少字符
            //找区间
            while(cur < n){
                n = n - cur;
                base *= 10;
                i++;
                cur = 9 * base * i;
            }
            //是哪个数字
            int num = base + (n - 1)/i;//(n-1)是因为串从0开始,要去掉0
            //是哪一位
            int index = (n - 1)%i + 1;//位数从1开始
            int temp = pow(10, i - index);
            int ans = num/temp%10;//取出这一位
            return ans;
        }
    };
    
    0 赞同 0 条回复
  • Mby 普通 2023年8月2日 下午7:56
    class Solution {
        public int findNthDigit(int n) {
            if(n == 0){
                return 0;
            }
    
            long bit = 1;
            int i = 1;
            long count = 9;
    
            while(count < n){
                n = (int) (n - count);
                bit = bit * 10;
                i++;
                count = bit * i * 9;
            }
            //确定是在这个区间的哪个数
            long num = bit + (n - 1) / i;
            //确定在Num的那个字符
            int index = (n - 1) %i + 1;
            int res = (int)(num / Math.pow(10, i - index)) % 10;
    
            return res;
            //时间复杂度:O(logn)
            //空间复杂度:O(1)
        }
    }
    
    
    
    0 赞同 0 条回复
  • Marshan 普通 2023年8月2日 下午3:21
    class Solution {
    public:
        int findNthDigit(int n) {
            // 数位digit = digit + 1;
            // 起始数字start = start * 10;
            // 数位数量count = 9 * start * digit;
            // 确定 n 所在 数字 的 位数 ,记为 digit ;
            // 确定 n 所在的 数字 ,记为 num ;
            // 确定 n 是 num 中的哪一数位,并返回结果。
    
            unsigned long long digit = 1;
            unsigned long long start = 1;
            unsigned long long count = 9;
            while(n > count){
                n -= count;
                digit += 1;
                start *= 10;
                count = digit * start * 9;
            }
            long long num = start + (n - 1) / digit;
            long long res = (n - 1) % digit;
            return to_string(num)[res] - '0';
        }
    };
    
    0 赞同 0 条回复
  • 人生何处不青山 普通 2023年7月30日 下午11:25

    智力题了属于

    function findNthDigit(n: number): number {
        if(n === 0) return n;
        let start = 1;
        let digits = 1;
        while( n > 9 * start * digits) {
            n -= 9 * start * digits;
            start *= 10;
            digits++;
        }
        let num = start + Math.floor((n - 1 ) / digits);
        return parseInt(num.toString().charAt((n-1) % digits),10);
    };
    
    0 赞同 0 条回复
  • 长河呼叫黄江 普通 2023年7月28日 下午10:11

    7.28
    Day19:下面是代码
    //-‘0’是一个字符运算,它的作用是将字符转换为对应的整数值。
    //ASCII码中,数字字符 ‘0’ 的值是 48,而其他数字字符的值依次递增。通过执行字符运算 -‘0’,我们可以将字符转换为对应的整数值。

    class Solution {
        public int findNthDigit(int n) {
            int digit = 1;
            long start = 1;
            long count = 9;
            while(n > count){
                n -= count;
                digit += 1;
                start *= 10;
                count = 9 * digit * start;
            }
            long num = start + (n - 1) / digit;
            return Long.toString(num).charAt((n - 1) % digit) - '0' ;
        }
    }
    
    
    
    0 赞同 0 条回复
  • CKX 普通 2023年7月28日 下午3:45
    func findNthDigit(n int) int {
        //digit 所在数字的位数 start 起始数字 count 数位数量
        digit, start, count := 1, 1, 9
        //1.确定所在数字的位数
        for n > count {
            n -= count
            start *= 10
            digit += 1
            count = 9 * start * digit
        }
        //2.确定所求数位所在的数字 即第几个字符
        num := start + (n - 1) / digit
    
        index := (n-1)%digit
        numStr := strconv.Itoa(num)
        return int(numStr[index]-'0')
    
    }
    
    • 找规律难做,大概理解
    0 赞同 0 条回复

# 回答此问题

后才能回答