原创 KMP算法與string::find以及strstr的比較

首先,簡單描述一下KMP算法,要理解好KMP算法,最好參考算法導論[1],尤其是先理解好自動機匹配的方法,再看KMP就很容易理解了。它利用的是一個關鍵的回退原理,也就是如果匹配失敗時,那麼我知道只要從模式的某個位置繼續匹配就可以了,這個回

原创 一個數拆分成連續自然數的和(只考加法的面試題)

題目:給定一個自然數,如何將它拆分成幾個連續的自然數的和的形式,例如:9 = 4 + 5,12 = 3 + 4 + 5等,有哪些數不能分解成這樣的形式,例如4,8等 分析:通過上面的幾個例子可以發現一下規律: 1)所有的奇數n都可以分解成

原创 程序設計的非常規總結

一般思想 1、將問題簡化,從比較簡單的情況開始分析,比如1個元素情況,2個元素情況,3個元素情況,不斷增加,尋找規律,這樣有利於發現規律,從而解決問題,並且也有利於處理邊界情況。比如編程之美1.11、又如送貨站選址問題、1的個數問題等都可

原创 尋找最近點對

題目:平面中有若干個點,尋找距離最近的兩個點。 分析: 方法1:兩兩點比較,尋找最近的兩個點對,複雜度O(N^2),優點代碼簡單不容易出錯 方法2:觀察兩兩比較的方法,發現有很多無用的比較,對於每一個點只要計算到它最近的點的距離就可以了,

原创 區間重合判斷(區間覆蓋問題)

題目:給定一些無序區間,判斷某個給定的特定區間是否在這些無序的區間內。 這個題目比較簡單,首先將給定的區間排序,在對重合的區間進行排序,使得區間變成

原创 雙調旅行商問題(TSP)bitonic tours

參考文獻: http://www.cs.huji.ac.il/course/2004/algo/Solutions/bitonic.pdf http://www.cppblog.com/doer-xee/archive/2009/11/3

原创 ini文件解析器

自動機是文本匹配文本解析的利器,這裏仿造參考文獻[1],實現一個ini配置文件解析器,狀態機在處理文本解析的工作過程是這樣的,不斷讀取輸入的字符,根據當前的狀態對字符進行處理,處理的過程主要包括狀態的轉換等動作,知道處理完畢全部的輸入字符

原创 計算字符串的相似度(編輯距離)

題目: 對於一個字符串a可以通過增加一個字符、刪除一個字符、修改一個字符,將字符串a變成字符串b,例如 a= abcddefg b = abcefg 可以通過a字符串刪除兩個dd得到b字符串,也可以通過b字符串增加dd編程a字符串,從上面

原创 數組分割問題

文獻[1][2][3]都是相同的解法,其中[4]的評論中有完整的解法,但不是很好理解,直到寫這個文章時,還是不太理解。 文獻[5]dlyme的回帖給了一個很好的思路,他的原文如下: 假設S=(a[1]+a[2]+...+a[n]+a[n+

原创 最短摘要生成

題目:抽象點說,就是在一個字符串中,找一些目標字符串,找到包含所有目標字符串的最小字符串。題目雖然叫做最短摘要生成,但和實際的搜索snippet的計算還是有比較大的差距的。 解法:文獻[1]給出了一種比較好的解法,策略還是使用雙指針,雙指

原创 面試題目資源列表

  http://blog.csdn.net/lzc52151/article/details/6221852    http://zhedahht

原创 重建二叉樹

題目:給定二叉樹的先序和中序遍歷,構建這個二叉樹。例如:先序遍歷結果是:abdcef,中序遍歷的結果是:dbaecf,如何構建二叉樹 分析:先序遍歷的結果中的每一個節點,將中序遍歷的結果分爲左右子樹兩部分,遞歸構建二叉樹,就可以完成樹得構

原创 排列問題

按照字典序生成所有的排列,可以這樣考慮,首先對輸入的數組進行一個排序,不斷的構建比當前在字典序上大1個的序列,直到構建到最大的序列,無法再次構建爲止。具體的算法描述如下(來自參考文獻[1]): Generation in lexico

原创 數組循環移位

abcd1234 -> 右移2位 -> 34abcd12 解法: abcd1234 -> abcd12 | 34 -> 21dcba |  43 ->34abcd12 程序如下: #include <stdio.h> template<t

原创 隊列中取最大值操作問題

問題:設計一個隊列能夠在O(1)時間內取得隊列的最大值。 分析: 這個問題和設計一個在O(1)時間內取最大值的堆棧看似比較相似,但實現難度要比最大值的堆棧困難一些,開始想模仿最大值堆棧的思想來設計取最大值的堆棧都失敗了。實際上這個問題可以