• 遇到的几个算法题


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


  • 相关阅读:
    how to singleton pattern !
    n6600 支持keepalive吗?
    6600的几个不可能的任务!
    Heyy.... i am back with 100 Apps for nokia 6600!
    http client chunked implement via sun
    Excel公司正式发售WinA&D 4.0
    快速开发rails、==常用插件==
    单独使用ActionMailer作为邮件发送器为迩的程序发送报告
    如何在win7上添加自动启动项
    gem install 报错或是太慢,gem install 本地安装
  • 原文地址:https://www.cnblogs.com/leeeee/p/7276165.html
Copyright © 2020-2023  润新知