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)
//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数列