zoukankan      html  css  js  c++  java
  • 面试遇到了 <计算从1到N中1的出现次数>结果悲剧了.

    面试遇到<计算从1到N中1的出现次数>这个题,结果没能做出来.下面是这道题的三种解法.简要的记录一下.

    View Code
    namespace n中1出现的次数
    {
        class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine(CountOne2(911111111099999009));
            }
            //最简单,容易理解的解法
            public static long CountOne3(long n)
            {
                long i = 0, j = 1;
                long count = 0;
                for (i = 0; i <= n; i++)
                {
                    j = i;
                    while (j != 0)
                    {
                        if (j % 10 == 1)
                            count++;
                        j = j / 10;
                    }
                }
                return count;
            }
            //效率最好的解法
            public static long CountOne2(long n)
            {
                long count = 0;
                long i = 1;
                long current = 0, after = 0, before = 0;
                while ((n / i) != 0)
                {
                    current = (n / i) % 10;
                    before = n / (i * 10);
                    after = n - (n / i) * i;
    
                    if (current > 1)
                        count = count + (before + 1) * i;
                    else if (current == 0)
                        count = count + before * i;
                    else if (current == 1)
                        count = count + before * i + after + 1;
    
                    i = i * 10;
                }
                return count;
            }
    
            //递归解法,效率一般
            public static long CountOne(long n)
            {
                long count = 0;
                if (n == 0)
                    count = 0;
                else if (n > 1 && n < 10)
                    count = 1;
                else
                {
                    long highest = n;//表示最高位的数字
                    int bit = 0;
                    while (highest >= 10)
                    {
                        highest = highest / 10;
                        bit++;
                    }
    
                    int weight = (int)Math.Pow(10, bit);//代表最高位的权重,即最高位一个1代表的大小
                    if (highest == 1)
                    {
                        count = CountOne(weight - 1)
                        + CountOne(n - weight)
                        + n - weight + 1;
                    }
                    else
                    {
                        count = highest * CountOne(weight - 1)
                        + CountOne(n - highest * weight)
                        + weight;
                    }
                }
                return count;
            }
    
        }
    }

    原文详细解说地址:http://www.nowamagic.net/algorithm/algorithm_CountOccurrencesOfOne.php

  • 相关阅读:
    搭建docker registry私有镜像仓库
    安装go client调用Kubernetes API
    Kubernetes搭建Hadoop服务
    Kubernetes部署Kafka集群
    Kubernetes使用StorageClass动态生成NFS类型的PV
    Linux配置网络服务
    Kubernetes设置命名空间
    Kubernetes的简单Demo
    docker操作的一些例子
    MySQL的一些基本概念
  • 原文地址:https://www.cnblogs.com/fumj/p/2618966.html
Copyright © 2011-2022 走看看