算法

1. LBS(最长公共子串)

  子串不要求连续(如 ABCBDAB和BDCABA的最长公共子串是 BCBA和BDAB

  动态规划问题。动态规划算法解最长公共子序列LCS问题

 1 public class LCS {
 2     public static void main(String[] args) {
 3         String x = "ABCBDAB";
 4         String y = "BDCABA";
 5         int substringLength1 = x.length();
 6         int substringLength2 = y.length();
 7 
 8         Long startTime = System.nanoTime();
 9 
10         int[][] opt = new int[substringLength1 + 1][substringLength2 + 1];// 构造二维数组记录子问题x[i]和y[i]的LCS的长度
11 
12         // 动态规划计算所有子问题
13         for (int i = substringLength1 - 1; i >= 0; i--) {
14             for (int j = substringLength2 - 1; j >= 0; j--) {
15                 if (x.charAt(i) == y.charAt(j))
16                     opt[i][j] = opt[i + 1][j + 1] + 1;
17                 else
18                     opt[i][j] = Math.max(opt[i + 1][j], opt[i][j + 1]);
19             }
20         }
21 
22         System.out.print("LCS:");
23 
24         int i = 0, j = 0;
25         while (i < substringLength1 && j < substringLength2) {
26             if (x.charAt(i) == y.charAt(j)) {
27                 System.out.print(x.charAt(i));
28                 i++;
29                 j++;
30             } else if (opt[i + 1][j] >= opt[i][j + 1])
31                 i++;
32             else
33                 j++;
34         }
35 
36         Long endTime = System.nanoTime();
37         System.out.println("\nTotle time is " + (endTime - startTime) + " ns");
38     }
39 }

 2. 找到数组中出现次数超过一半的数字(前提是:数组中一定存在某个数超过数组长度的一半)

  出现次数超过一半的数字

3. 如何给10^7个数据量的磁盘文件排序

  问题描述:
    输入:一个最多含有n个不重复的正整数(也就是说可能含有少于n个不重复正整数)的文件,其中每个数都小于等于n,且n=10^7。
    输出:得到按从小到大升序排列的包含所有输入的整数的列表。
    条件:最多有大约1MB的内存空间可用,但磁盘空间足够。且要求运行时间在5分钟以下,10秒为最佳结果。

4.  字符串左移,void *pszStringRotate(char *pszString, int nCharsRotate),比如ABCDEFG,移3位变DEFGABC,要求空间复杂度O(1),时间复杂度O(n)

  先把翻转前n-3个 然后翻转后3个 也可以先后后前 如 ABCDEFG -> DCBA GFE -> EFGABCD 这样就OK了 来自《编程艺术》

5.

6.

posted @ 2012-10-09 17:19  hanyuanbo  阅读(229)  评论(0编辑  收藏  举报