zoukankan      html  css  js  c++  java
  • 32.从1到n整数中1出现的次数

    思想:

     递归实现

     首先,若这个数的最高位是1,则他的最高位含1的数量为:这个数出去最高位剩下的数+1

        若这个数的最高位不是1,则它的最高位的含1的数量为:10的k-1次方,k是n的位数

     然后,其余为可以用最高位的数字*除去最高位剩下的位数*某一位固定是1的情况(10的k-2次方)

        最后,递归实现。

     最优解代码:

     

    import java.util.*;
    import java.lang.Math;
     
    public class Solution {
        public int NumberOf1Between1AndN_Solution(int n) {
            if(n < 1 ){
                return 0;
            }
            int len = GetLen(n);
            if(len == 1){
                return 1;
            }
            int tmp = GetPowernum(len-1);
            int first = n/tmp;
            int firstnum = first == 1? n%tmp+1 : tmp;
            int othernum = first*(len-1)*(tmp/10);
            return firstnum+othernum+NumberOf1Between1AndN_Solution(n%tmp);
        }
        public int GetLen(int n){
            int len = 0;
            while(n != 0){
                len++;
                n = n/10;
            }
            return len;
        }
        public int GetPowernum(int dase){
            return (int) Math.pow(10,dase);
        }
    }

     时间复杂度:O(logN*logN),其中递归的时间复杂度是logN,GetLen和GetPowernum的时间复杂度分别为O(logN)和O(log(logN))

  • 相关阅读:
    Redis扩展功能
    Redis持久化
    redis-通讯协议及事件处理机制
    Redis-数据类型与底层数据结构
    分布式集群架构场景化解决方案
    MySQL-运维和第三方工具
    缓存原理&设计
    MySQL性能优化
    MySQL高级-日志常用的工具等等
    Mysql高级——优化
  • 原文地址:https://www.cnblogs.com/zxx930929/p/7793204.html
Copyright © 2011-2022 走看看