zoukankan      html  css  js  c++  java
  • 剑指offer 57. 数字序列中某一位的数字

    题目来源:剑指offer 57. 数字序列中某一位的数字  

     自我感觉难度/真实难度:             写题时间时长:1hour

     题意:

     分析:

     自己的代码:

    代码效率/结果:

     优秀代码:

    class Solution {
    public:
        int digitAtIndex(int n) {
             long long i = 1, s = 9, base = 1;//i表示是几位数,s表示位数共有多少个,base表示位数的起始值。
             while(n > i * s) {   // 9, 90, 900, 9000, 90000, i * s表示位数总共占多少位。
                 n -= i * s;         // 1000 - 9 - 90 * 2 - 900 * 3 ,当i= 3 时不符合条件,说明是在三位数里面。
                 i ++;                
                 s *= 10;
                 base *= 10;
             }
             int number = base + (n + i - 1) / i - 1; //求位数的第几个数, 1000 - 9 - 180 = n , n / 3 + base - 1(考虑0故减1), 向上取整 n + i - 1。
             int r = n % i ? n % i : i;              // 除不尽就是第几位,除尽力了就是最后一位。
             for (int j = 0; j < i - r; j ++) number /= 10; //求数的第i - r位,取出第i - r位。
    
             return number % 10;
        }
    };

    // i表示是几位数:1,2,3...

    // s表示位数共有多少个: 1位数9个(先忽略0),2位数90个,3位数900 个

    // base:表示几位数的基数,1位数是1,2位数是10,3位数是100

    代码效率/结果:

     自己优化后的代码:

     反思改进策略:

    1.对这些靠数学推导的题目,感觉还是很难,可能是数学头脑不太好

  • 相关阅读:
    Java进阶知识查漏补缺06
    SQL学习记录(concat)
    Restful API学习
    git学习
    获得xmlhttp对象
    vue-cli初接触
    vue初接触
    java使用百度UNIT
    JSON学习
    通用Mapper警告:建议修改基本类型为对应的包装类型!
  • 原文地址:https://www.cnblogs.com/captain-dl/p/11283362.html
Copyright © 2011-2022 走看看