剑指offer36 JZ44 数字序列中某一位的数字

数字序列中某一位的数字

https://www.nowcoder.com/practice/29311ff7404d44e0b07077f4201418f5?tpId=13&tqId=2285751&ru=/exam/oj/ta&qru=/ta/coding-interviews/question-ranking&sourceUrl=%2Fexam%2Foj%2Fta%3Fpage%3D1%26tpId%3D13%26type%3D13

    // 0
    // 1 ~ 9      | digit = 1 start = 1 * 1       count = 1 * 9 * 1
    // 10 ~ 99    | digit = 2 start = 1 * 10      count = 10 * 9 * 2
    // 100 ~ 999  | digit = 3 start = 1 * 10 * 10 count = 100 * 9 * 3
  1. 锁定位数对应区间(减去前面的所有位数)

  2. 找到区间对应的那个数字

  3. 找到目标位数对应目标数字对应的下标

  4. 通过字符串索引返回

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return int整型
     */
    public int findNthDigit (int n) {
        // write code here
        // 0
        // 1 ~ 9      | digit = 1 start = 1 * 1       count = 1 * 9 * 1
        // 10 ~ 99    | digit = 2 start = 1 * 10      count = 10 * 9 * 2
        // 100 ~ 999  | digit = 3 start = 1 * 10 * 10 count = 100 * 9 * 3
        int digcount=1;//记录区间数
        int start=1; //区间上限数
        int end=9;//区间下限数
        if(n<=0){
            return 0;
        }
        while(n>end){
            n-=end;//减去前面的位数
            digcount++;//记录区间数
            start=start*10;//上限扩大10倍
            end=start*end*digcount;//下线扩大start*digcount倍
            
        }
        //
        String  num=""+(start+(n-1)/digcount); //找到目标数字
        int numIndex=(int)(n-1)%digcount ;//找到目标位数所对应目标数字的下标
        return  Integer.parseInt(num.charAt(numIndex)+""); //锁定位置
    }
}

官方

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param n int整型 
     * @return int整型
     */
    public int findNthDigit (int n) {
        // write code here
        // 0
        // 1 ~ 9      | digit = 1 start = 1 * 1       count = 1 * 9 * 1
        // 10 ~ 99    | digit = 2 start = 1 * 10      count = 10 * 9 * 2
        // 100 ~ 999  | digit = 3 start = 1 * 10 * 10 count = 100 * 9 * 3
        if (n <= 0) return 0;
        long start = 1, digit = 1, count = 9;
        while (n > count) {
            n -= count; // 减去当前位数的总长度
            start *= 10;
            digit += 1;
            count = start * 9 * digit;
        }
        // 找到当前位数的区间了
        String num = (start + (n - 1) / digit) + ""; // 减去第0号元素0
        int idx = (int)((n - 1) % digit);
        return Integer.parseInt(num.charAt(idx) + "");
    }
}

全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务