剑指Offer面试题44:数字序列中某一位的数字(有一个好方法,要记住)

这道题一开始没看明白是什么意思,后来看明白了之后,做出来了,但是花的时间比较长,原因在于,有几个本应当设置为long类型的变量,设置成了int。

但是答案的代码,非常简洁。

我的代码

    public int findNthDigit(int n) {
        //0-9 9   10
        //10-99 2*90   190
        //100-999 3*900   2890
        //1000-9999 4*9000   38890
        //10000-99999 5*90000   488890
        //100000-999999 6*900000  5888890
        //1000000-9999999 7*9000000  68888890
        long pre_num = 10;
        int digit = 2;
        long fi_num = 90;
        int result = -1;
        int oringin_n = n;

        if(n>=10){

            n-=9;
            pre_num = digit*fi_num;
        }else{
            result = n;
        }
        //n==999999991
        //pre_num==180;
        
        while(result == -1){
            if(n>pre_num){

                n -= pre_num;
                digit++;
                fi_num *= 10;
                pre_num = digit*fi_num;
                
                //n==999999811
                //digit = 3
                //fi_num = 900
                //pre_num== 2700
                //n 999997111
                //4
                //9000
                //36000
                //999961111
                //5
                //90000
                //450000
                //999511111
                //6
                //900000
                //5400000
                //994111111
                //7
                //9000000
                //63000000
                //931111111
                //8
                //90000000
                //720000000
                //211111111
                //9
                //900000000
                //8100000000
            }else{
                int start_num = 1;
                for(int count = 1;count<digit;count++){
                    start_num *=10;

                }
                int target_num = start_num + (n-1)/digit;
                int target_digit = (n-1)%digit;
                
                    
                    for(int count = 0;count<=target_digit;count++){
                        result = target_num/start_num;
                        int reduce_num = result* start_num;
                        target_num-=reduce_num;
                        start_num/=10;
                    }
                

                

            }
        }
        return result;
    }

答案的代码(https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/solution/mian-shi-ti-44-shu-zi-xu-lie-zhong-mou-yi-wei-de-6/

class Solution {
    public int findNthDigit(int n) {
        int digit = 1;
        long start = 1;
        long count = 9;
        while (n > count) { // 1.
            n -= count;
            digit += 1;
            start *= 10;
            count = digit * start * 9;
        }
        long num = start + (n - 1) / digit; // 2.
        return Long.toString(num).charAt((n - 1) % digit) - '0'; // 3.
    }
}

作者:jyd
链接:https://leetcode-cn.com/problems/shu-zi-xu-lie-zhong-mou-yi-wei-de-shu-zi-lcof/solution/mian-shi-ti-44-shu-zi-xu-lie-zhong-mou-yi-wei-de-6/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

首先是,我的while和前面是一个逻辑,可以合并,然后,start直接在循环里计算,没有另列出来,最后的Long.toString(num).charAt() - '0';是一个取位很巧妙的方法。要记住

猜你喜欢

转载自blog.csdn.net/qq_40473204/article/details/114543901