遇到的几个算法题

来源:互联网 发布:java web实训项目总结 编辑:程序博客网 时间:2024/04/30 01:06

1、如何快速求得与某个数平方根最接近的整数

数学上平方根一般由级数展开求得。但是此处只求其近似整数,用二分查找法,复杂度为Log(N)。


2、有一个几个T的大文件,记录了若干价格记录,需要累加计算总价,如何算。现在计算机内存有限。

使用Java内存映射文件 java.nio.MappedByteBuffer ,比java.io.BufferedInputStream 快很多


3、有若干个大文件,里面保存了各个URL的访问记录,顺序是乱的,要求将各个URL 访问的记录数量汇总。计算机内存很小。

将文件的记录重新按照URL的HashCode范围重新写入到若干个文件中,若是其中某个文件依旧太大,再将该文件拆分。这样相同URL只会在同一个文件中。


4、有一个数列0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89,......, 给出数列下标,求出该下标对应元素

注意,这是fibonacci数列,其通项为:A(n)=A(n-1)+A(n-2) .用一个循环就可以求出,不要用递归,递归会重复计算。

for(int i=2; i<=n;i++ ){      A[n] = A[n-1] + A[n-2];}


5、给定一串整数,找出其中和最大的连续子数列,包括子数列的位置和最大和。

http://blog.csdn.net/lilypp/article/details/6124871

线性算法:

这个算法是基于两个结论得来的:
(1)、如果数列A的某个子列A(i, j) 的和S(i, j) < 0, i< j<q,那么A(i, q)  肯定不是数列A的最大递增子列。

S(i, q) = S(i, j) + S(j+1, q) < 0 + S(j+1, q) = S(j+1, q)
这个结论说明,从位置 i 开始的子列,一旦遇到和为0的子列,后面可以不搜索了,直接从 j+1 开始重新计算。

 (2)、如果A(i, j) 是数列A以 i 起始的子列中第一个和S(i, j) < 0 的,则对任意 i <= p <= j, p<= q,A(p, q) 的和 S(p, q) 要么小于最大连续子列和,要么与现存的最大连续子列和相等。所以A(p, q)序列可以跳过。
 因为S(i ,j) 是第一个<0 的,所以S(i, p-1)必然>=0,则 S(p, q) = S(i, q) - S(i, p-1) <= S(i, q)

- 当 q > j 时,由结论1得知, S(i, q) < S(j+1, q),则 S(p, q) < S(j+1, q)

- 当q <= j 时,(这个暂时不会证明。。。)
//o(n)void MaxSubSet_2(int nums[], int length){if (length == 0)return;int start = 0;int sum = nums[0];int maxStart = 0;int maxEnd = 0;int maxSum = nums[0];for (int i = 1; i < length; i++){sum += nums[i];if (sum > maxSum){maxStart = start;maxEnd = i;maxSum = sum;}if (sum < 0){start = i + 1;sum = 0;}}cout << "Max: " << maxSum << " ( " << maxStart << ", " << maxEnd << " )" << endl;}

6、有100步楼梯,每次走1步或两步 问有多少走法

上到第n级共有a(n)种方法
那么:a(1)=1,a(2)=2,a(3)= a(2)+1=3,a(4)=a(3)+ a(2) .....

上到第n级有两种情形
①从第n-1级上1步
②从第n-2级上2步(不能上1步,否则与第一种情形重复)

a(n)=a(n-1) + a(n-2)  ...

又是一个 fibonacci数列


0 0