`
cherami
  • 浏览: 212285 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Google面试题解说性能之六:数学显神威

    博客分类:
  • Java
阅读更多

其实很多问题一旦涉及到数学问题或者数据处理密集型问题,那么最终显现神威的就是数学公式,这个面试题也是这类问题,所以如果我们能够推导出一个数学公式就是最理想的,在前面的例子中,我们进行了一些深入的分析,根据前面的例子,你可能会尝试把步长从100扩展到1000或者10000,但是实际上这个方法遇到了瓶颈,因为循环嵌套的层次太多,计算公式太复杂也会导致问题。如果我们最开始尝试的时候把全部的f(n)的结果打印出来,你会发现这样的内容:

  1. f(9) = 1
  2. f(99) = 20
  3. f(999) = 300
  4. f(9999) = 4000
  5. ……

这个是我们的第一个规律:位数乘以((位数-1)的10的次方)。
根据这个f(n)的说明,我们定义另外一个方法x(n),它的定义就是n这个数包含的1的个数,例如x(1)=1,x(2)=0,x(11)=2,那么我们可以把f(n)展开为:
f(n)=x(0)+x(1)+……+x(n)
同时我们可以把x(n)也展开,假设n=XYZ,那么x(n)的展开式为:
x(n)= x(X)+x(Y)+x(Z)
也等于:
x(n)= x(X)+x(YZ)
再结合上面的规律我们就可以推导出一个规律了,先用例子来说明,以106为例:
f(106) = x(0)+…+x(99)+x(100)+…+x(106) = f(99) + x(100)+…+x(106)
f(99)我们使用上面的第一个规律很容易计算得到,那么后面的这7个数包含多少个1呢,其实也很简单,应用可能小学就学过的公因子概念,当然这里不是真正的公因子,而是这些数里面包含的1的个数相同的部分,结合x(n)的展开式,我们进一步推演出:
f(106) = f(99) + x(1)+ x(00)+x(1)+x(01)+…+x(1)+x(06) = f(99) + x(1) * (6+1) + x(00) + .. x(06) = f(99) + x(1) * (6+1) + f(6)
这样计算就很简单了,不是吗?
好,再看看f(234)的情况,有点不太一样:
f(345) = x(0)+…x(99)+x(100)+…+x(199)+x(200)+..+x(299)+x(300)+…+x(345)= f(99) + x(1) * (99+1) + f(99)+ x(2)*(99+1)+f(99)+x(3)*(45+1)+f(45)
这个例子足够典型了吗?看到规律了吗?
给定一个数n,假设最高位为x,除去最高位的数字为y,位数为z,那么
如果x=1,那么f(n)等于f(pow(10,z-1)-1)+(y+1)+f(y)
如果x>1,那么f(n)等于f(pow(10,z-1)-1)*x+pow(10,z-1)+f(y)

转换为代码就是:

  private static int fn(int number) {
    if (number < 10) {
      return number > 0 ? 1 : 0;
    }
    String s = number + "";
    int length = s.length();
    int end = Integer.parseInt(s.substring(1, length));
    int x = s.charAt(0) - ‘0′;
    int result = 0;
    if (x == 1) {
      result = (length - 1) * (int) Math.pow(10, length - 1 - 1) + fn(end)
          + (end + 1);
    } else {
      result = (length - 1) * (int) Math.pow(10, length - 1 - 1) * x
          + (int) Math.pow(10, length - 1) + fn(end);
    }
    return result;
  }

你可以运行试试这个公式是否准确。
最后需要强调一下的是,这个方法可以快速的计算给定的一个数的f(n)的结果,但是如果用一个简单的循环来查找符合f(n)=n的结果是不合适的,这个我会另外再谈的。


作者: Cherami
原载: 解惑
版权所有。转载时必须以链接形式注明作者和原始出处及本声明。
分类: Java
分享到:
评论

相关推荐

    前端面试题:前端框架面试题大全

    前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; 前端面试题:前端框架面试题大全; ...

    性能测试面试题宝典-覆盖大部分性能专项面试题

    性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖大部分性能专项面试题性能测试面试题宝典--覆盖...

    2021-最新大厂AI面试题q2版121题:含答案及解析21.7.23

    《微软面试 100 题系列》、《BAT 机器学习面试 1000 题系列》、《名企 AI 面试 100 题》以及《2021 最新大厂 AI 面试题》等题库,不仅覆盖了AI领域的多个方向,而且提供了详细的答案和解析,有助于求职者深入理解...

    google面试题题及数学趣题

    标题《Google面试题及数学趣题》涉及的内容主要涵盖了两大部分:Google的面试题目分析以及一些锻炼思维能力的数学趣题。Google面试题作为IT行业求职者关注的焦点,它们不仅是面试的门槛,更被视为衡量应聘者技术水平...

    常见的性能测试工程师面试题(附答案)

    "性能测试工程师面试题汇总" 性能测试工程师面试题是指性能测试工程师在面试过程中遇到的常见问题,涵盖了性能测试的基础知识、LoadRunner 的使用、场景设置、脚本录制、参数设置、关联机制、调试技巧等多个方面。 ...

    jmeter性能面试问答题

    【JMeter性能测试详解】 JMeter是一款强大的性能测试工具,常用于模拟大量用户并发访问Web应用程序,以评估系统的性能和稳定性。以下将详细介绍JMeter的使用、线程组配置及性能测试的关键点。 **JMeter录制与过滤*...

    一份就够!史上最全面Python面试题和详解(10个文件)看完啥都会了.zip

    文档“python面试题搜集(六):110道Python面试题(上).md”和“python面试题搜集(六):史上最全python面试题详解(三).md”可能包含更多实战性问题,涉及Python性能优化、并发编程、设计模式以及Python与其他...

    RabbitMQ相关的面试题和问题解析

    rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:RabbitMQ相关的面试题和问题解析 rabbitmq面试:...

    云计算面试题之ELK面试题,运维工程师必备云计算面试题之ELK面试题,运维工程师必备云计算面试题之ELK面试题,运维工程师必备云

    云计算面试题之ELK面试题,运维工程师必备云计算面试题之ELK面试题,运维工程师必备云计算面试题之ELK面试题,运维工程师必备云计算面试题之ELK面试题,运维工程师必备云计算面试题之ELK面试题,运维工程师必备...

    Java面试题-每日一题:String、StringBuffer、StringBuilder的区别

    Java面试题-每日一题:String、StringBuffer、StringBuilder的区别

    GOOGLE面试题集锦

    Google面试题集锦 在当今社会,Google作为全球顶尖的科技公司,其招聘流程和面试题一直备受业界关注。公司的面试流程设计严谨,面试题目覆盖面广泛,既考察应聘者的基本技术知识,又深挖其逻辑思维能力、创造力以及...

    10万字总结java面试题和答案(八股文之一)Java面试题指南

    JavaOOP面试题 Java集合/泛型面试题 Java异常面试题 Java中的IO与NIO面试题 Java反射面试题 Java序列化面试题 Java注解面试题 多线程&并发面试题 JVM面试题 Mysql面试题 Redis面试题 Memcached面试题 MongoDB面试题 ...

    牛客大数据面试题集锦+答案,共523道,46W+字。大厂必备

    大数据面试题V3.0完成了。共523道题,679页,46w+字,来源于牛客870+篇面经。 主要分为以下几部分: Hadoop面试题:100道 Zookeeper面试题:21道 Hive面试题:47道 Flume面试题:11道 Kafka面试题:59到 HBase面试题...

    172份,7701页互联网大厂面试题.pdf

    172份,7701页互联网大厂面试题 172份,7701页互联网大厂面试题 172份,7701页互联网大厂面试题

    2021最新Java面试题合集.zip

    Java作为一门广泛使用的编程语言,其面试题涵盖了众多领域,包括基础、并发编程、网络、虚拟机、大数据处理以及各种框架。以下是对这些面试题集合的详细解析: 1. **BIO, NIO, AIO, Netty面试题 35道**: - **BIO*...

    java程序员面试题——863面试集

    ### Java程序员面试题详解 #### 一、Java基础知识 1. **作用域public, private, protected, 以及不写时的区别** - **public**: 可以被任何类访问。 - **protected**: 可以被同一包内及不同包内的子类访问。 - ...

    前端面试题大全(40个VUE3.0面试题PDF、CSS、JS、REACT、全栈面经、小程序、性能优化)千道面试题,送前端简历模板

    覆盖范围:(40个VUE3.0面试题PDF、CSS面试题、JS面试题、REACT面试题 全栈面试题、小程序面试题、性能优化) # 前端面试题 非常重要 难度都是根据自己学习情况掌握的。 - 不能只靠背面试题 要去理解 面试题背后的...

    常见C++面试题汇总(最全c语言面试题)

    常见C++面试题汇总(最全c语言面试题) 所包含文件: 1、华为C++内部培训材料 2、130道面试题.doc 3、C++试题.htm 4、C-C++ 程序设计员应聘常见面试试题深入剖析.mht 5、C语言面试题大汇总之华为面试题.txt 6、C语言...

    面试题.zip

    【标题】:“面试题.zip”是一个集合了多个IT面试常见问题的压缩文件,涵盖了Web开发的多个关键领域,包括Vue.js、移动Web、JavaScript高级、Ajax、Node.js、Web API以及基础JavaScript等。 【描述】:“面试题.zip...

    Java后端高级面试题(详细概念+试题).pdf.zip

    Java后端高级面试题涉及到众多核心技术和框架,是衡量开发者是否具备高级技能的重要标准。这份“Java后端高级面试题(详细概念+试题).pdf.zip”压缩包包含了多个关键领域的深度探讨,对于准备面试或者提升自身技能的...

Global site tag (gtag.js) - Google Analytics