小米电话面试算法题

题目一

描述

  有10个球和10个盒子,每次可以拿一个球或者两个球放入盒子之中。每个盒子只能装一个球,一共有多少种放法?

解答

  题目和上楼梯问题是一个道理(每次可以上一个或者两个台阶),是一个斐波那契数列问题。有如下推导:

1
2
3
4
5
6
f(n) = f(n - 1) + f(n - 2);
f(1) = 1;
f(2) = 2;
=>
数列为:1 2 3 5 8 13 21 34 55 89
f(10) = 89;

以上。

IEEE754浮点数标准

IEEE754

  IEEE 754 标准是IEEE浮点数算术标准(IEEE Standard for Floating-Point Arithmetic)的标准编号,等同于国际标准ISO/IEC/IEEE 60559。该标准由美国电气电子工程师学会(IEEE)计算机学会旗下的微处理器标准委员会(Microprocessor Standards Committee, MSC)发布。IEEE 754 标准规定了计算机程序设计环境中的二进制和十进制的浮点数自述的交换、算术格式以及方法。
  IEEE 754规定了四种表示浮点数值的方式:单精确度(32位)、双精确度(64位)、延伸单精确度(43位以上,很少使用)与延伸双精确度(79位元以上,通常以80位元实做)。只有32位模式有强制要求,其他都是选择性的。大部分编程语言都有提供IEEE格式与算术,但有些将其列为非必要的。例如,IEEE 754问世之前就有的C语言。IEEE754标准包括IEEE算术,但不算作强制要求(C语言的float通常是指IEEE单精确度,而double是指双精确度)。

分布式关系型数据库解决方案

前言

  伴随着IT互联网技术的发展,传统的集中式数据库愈发的暴露其弊端:集中式处理必然导致访问瓶颈,系统的数据安全隐患比较大,机器的容灾能力差,单点故障会造成整个业务系统瘫痪。所以分布式数据库势在必行,当下HBASE或者HDFS普遍被用来作为存储介质。对于关系型数据库,如何进行分布式管理与部署,本文对现有的开源解决方案进行了相关的调查。(以mysql为主)
  分布式关系型数据库的关键主要有以下几点:

  • 分库
  • 分表
  • M-S
  • 集群
  • 负载均衡
  • 编程接口

字符串算法之——BK树

前言

  有关于字符串的算法有很多应用场景,诸如:搜索,生物工程,基因序列等等。本文所涉及的算法是和字符串搜索相关的。假设有一系列的字符串集合dist[],需要从中找出任意给定字符串A最相似的TopN字符串。

基于前缀树的搜索

  前缀树:trie树常用于搜索提示。如当输入一个网址,可以自动搜索出可能的选择。当没有完全匹配的搜索结果,可以返回前缀最相似的可能。trie树实际上是一个DFA(有穷状态向量机),通常用转移矩阵表示。行表示状态,列表示输入字符,(行, 列)位置表示转移状态。这种方式的查询效率很高,但由于稀疏的现象严重,空间利用效率很低。也可以采用压缩的存储方式即链表来表示状态转移,但由于要线性查询,会造成效率低下。
  缺点:只有前缀完全匹配的字符串才能匹配到。

基于编辑距离树的算法

编辑距离(Edit Distance)

  又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。

1
2
3
4
例如将kitten一字转成sitting:
sitten (k→s)
sittin (e→i)
sitting (→g

webx框架初始化之--Springext

  Webx是一套基于Java Servlet API的通用Web框架。Webx致力于提供一套极具扩展性的机制,来满足Web应用不断变化和发展的需求。而SpringExt正是这种扩展性的基石。SpringExt扩展了Spring,在Spring的基础上提供了一种扩展功能的新方法。

Springext概念

  springext是基于spring的IOC机制扩展,springext提供了众多自己的工具箱,不仅于此,它最大的特点是提供给开发人员一种扩展spring bean管理的设计方案。springext涉及到了两个概念:扩展点和捐献。

  • 扩展点ConfigurationPoint
    • 扩展点相当于接口,和java接口的差别在于,扩展点和一个namespace相关联
  • 捐献Contribution
    • 捐献相当于实现,同时捐献和相应扩展点的namespace下的一个element相关联。

  扩展点的定义默认放在spring.configuration-points,初始化过程中会默认加载该文件,寻找扩展点与命名空间的对应情况。然后从*.bean-definition-parsers寻找对应的捐献解析类。

webx框架初始化主线之--webxContextLoaderListener

上一篇主要介绍了webx框架的项目管理工具maven及AutoConfig插件,这些工具可以让我们的开发更加的灵活。废话不多说,接下来切入webx框架的正题之中。纯属个人理解,欢迎拍砖!

前言

  webx框架的原理,笔者把按照两条主线来进行介绍。也是web开发之中通用的两条主线:初始化主线和请求处理主线。

  • 初始化主线:顾名思义,在web容器开始接受请求之前首先要启动容器并作一定的前期工作,该主线主要简单的从webx框架的启动流程,以及资源加载解析的方面做介绍。
  • 请求处理主线:处理前台发起的request,是web程序的通性。按照如何对request进行control,然后或者处理或者重定向,最终返回结果的设计思路,可以区分不同框架。该主线,主要分析从前台request进入后台容器之后,框架做的一系列处理。

Tomcat启动与web.xml的解析

  绝大多数的web程序都依赖于容器,webx底层基于java servlet而实现,故而必然依赖于Servlet容器。这里的servlet容器使用的是Ali-Tomcat。Ali-Tomcat介绍,戳这里tomcat.alibaba-inc.com

webx学习之--maven以及Autoconfig

maven概述

  Maven的核心是POM(Project Object Model),即项目对象模型。最直观的,maven对项目依赖进行统一的管理,让开发者从纷杂错乱的jar包世界摆脱出来,更加专注于项目构建以及开发。事实上,maven并不止是一个项目构建工具,它还是一个项目管理工具。它提供了一个项目对象模型,一组标准集合,一个项目生命周期,一个依赖管理系统和用来定义在生命周期阶段中插件目标的逻辑。
  POM文件结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

<modelVersion>4.0.0</modelVersion>
<version>1.0-SNAPSHOT</version>
<groupId>XXX</groupId>
<artifactId>XXX</artifactId>
<packaging>war</packaging>
<dependencies>
<dependency>
<!--jar依赖:包括groupId,artifactId,version-->
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<!--插件配置-->
</plugin>
</plugins>
</build>
</project>

  如上所示,定义了一个项目,其中主要元素包括:模型的版本,项目的版本,项目的名称,项目的打包类型,项目依赖,项目的插件配置。