算法
杭逸晨_ henry
互联网大厂8年工作经验,专注JAVA、分布式研发和架构设计、项目管理、运维等方向。欢迎沟通交流。
展开
-
面试题:求a,b两种方法
网上看到的一个面试题:长度为n的数组,由数字1到n组成,其中数字a不出现,数字b出现两次,其它的数字恰好出现一次。怎样通过只读遍历一次数组,找出数字a和b;只能遍历一次:方法1:首先想到的是列方程组,直接求解a,b;(1)等式1 :s1为1…n的和 s1=n(n+1)/2; 而s2是给定数组的和这样的话,根据题意有,s1=s2+a-b;(2)等式2: 平方和。 s3=1^2+2^2……n^2=n(n+1)(2n+1)/6;而s4是给定数组的平方和。所以有 S3=S4+ a^2-b原创 2015-02-25 22:16:58 · 1957 阅读 · 0 评论 -
大数n!
通常解决大数运算数据超出范围,溢出的问题。一般采用数组去模拟。求算n!可以看成是每次两个整数相乘的过程,因此可以模拟成大数相乘的过程。只是需要增加一些变量去存储中间的进位和当前位的数值。原创 2015-01-25 14:43:09 · 725 阅读 · 0 评论 -
分拆数组技巧应用
给你一个数组A[1..n],请你在O(n)的时间里构造一个新的数组B[1..n],使得B[i]=A[1]*A[2]*...*A[n]/A[i]。你不能使用除法运算。思路1:题目中说明,不能用除法,那一定是在相乘的时候,省略那一项,然后时间复杂度要0(n),就不能两层循环,而是要利用前面的相乘信息来降低复杂度。算法:相似的分拆技术在数组题中。线性时间构造两个新数组,从开始遍历相乘 T1[0] =1,T1[i]=T[i-1]*A[i-1] ;而 T2从后往前遍历相乘 T2[len-1] =1,T2[i]原创 2015-02-26 20:37:21 · 727 阅读 · 0 评论 -
和为n连续正数序列
题目:输入一个正数n,输出所有和为n连续正数序列。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-8。分析:这是网易的一道面试题。这道题和本面试题系列的第10题有些类似。我们用两个数small和big分别表示序列的最小值和最大值。首先把small初始化为1,big初始化为2。如果从small到big的序列的和大于n的话,我们向右移动small,相当于从序列中去掉较小的数字。如果从small到big的序列的和小于n的话,我们向右移动big,相当于向原创 2015-01-25 15:18:46 · 665 阅读 · 0 评论 -
快速幂
快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log2N), 与朴素的O(N)相比效率有了极大的提高。x^n = (x^(n/2))^2 n为偶数x^n = x*(x^(n/2))^2 n n为奇数原创 2015-01-25 14:53:56 · 628 阅读 · 0 评论 -
计算阶乘n!末尾所含的0的个数
问题描述 给定参数n(n为正整数),请计算n的阶乘n!末尾所含有“0”的个数。 例如,5!=120,其末尾所含有的“0”的个数为1;10!= 3628800,其末尾所含有的“0”的个数为2;20!= 2432902008176640000,其末尾所含有的“0”的个数为4。问题分析:显然,对于阶乘增长速度的非常快的,很容易就溢出了。当然就不可能把阶乘算出来,而是要找规律解决。下面用因式分解的思路来考虑:末尾的0可以分解为2*5,一个5,一个2就对应一个0;下面给出递推过程:(1原创 2015-02-26 20:44:13 · 898 阅读 · 0 评论 -
证明一个数能被3整除,当且仅当它的各位数的和能被3整除!
一个数能被3整除,当且仅当它的各位数的和能被3整除。一个简单的证明方法如下: 就拿一个四位数 abcd , 它可以表示为 1000*a+100*b+10*c+d = 999*a+99*b+9*c +(a+b+c+d), 999*a+99*b+9*c 能被3整除不用考虑,所以只要 a+b+c+d能被3整除就能说明四位数abcd能被3整除。证毕!原创 2015-02-26 20:48:50 · 3193 阅读 · 0 评论 -
字典树应用
Trie,又称字典树、单词查找树,是一种树形结构,用于保存大量的字符串。它的优点是:利用字符串的公共前缀来节约存储空间。相对来说,Trie树是一种比较简单的数据结构.理解起来比较简单,正所谓简单的东西也得付出代价.故Trie树也有它的缺点,Trie树的内存消耗非常大.当然,或许用左儿子右兄弟的方法建树的话,可能会好点.其基本性质可以归纳为:1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。 2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 3. 每个节点的所原创 2015-03-04 23:23:23 · 630 阅读 · 0 评论 -
如何将一个数组随机打乱
题目是如何将一个数据随机打乱:方案一:直观能想到一种算法是循环遍历数组,每一次产生一个随机的小标数,将这个下标所在的位置移出去,然后将这个值存到另外一个新的数组里,直到最后还有一个元素为止。这样的随机取出来的数组成的数组是随机。改算法伪代码: int j=0; int size = a.size; for(i=0;i < size ;i++)原创 2016-12-12 23:59:40 · 12571 阅读 · 0 评论