演算法和資料結構是筆試和技術麵必會涉及的內容,而且與程式設計有關最為基礎也是最為重要的也是這一塊,而目前筆記的題目往往是從公司的題庫中抽取的,"猜中"的可能性還是比較大的,但如何去猜,並不是說我們上網把那什麼面試寶典上的題全記一遍,但如果記性好,那也可以,比如那什麼排序,查詢考的可能性較大的,但是這樣對於自己的思維上的提高真的幫助很小,這些天看演算法和資料結構下來,發現很多的演算法的思想方法是相通的,如果再了解如何去權衡時間複雜度和空間複雜度,如何優化自己的演算法,這個過程才是最為重要的.
總結這些的學習,什麼是符合題意的演算法,網上基本都找的到,我覺得如果要記錄下,最主要的是記錄思考過程及思想方法.
ps.有些演算法直接摘自網路,方便閱讀.
什麼左旋字型串,其它定義為把字串前面若干個字元移動到字串的尾部
設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位,要求時間複雜度為o(n),
且只允許使用兩個附加變數。
如:
abcd1234→4abcd123→34abcd12→234abcd1→1234abcd。
這裡的字串的移動主要是通過字元交換完成.
這裡我們可以發現其右移後的字串和未移時的相比,可以明顯的分段,即abcd和1234,兩子段的順序沒有變化.
這裡我們給出乙個思路,因為迴圈右移的整體感覺就是兩個子段的交換位置
法一,常用的方法是:先將子段逆順,然後再整體逆序.
我們可以這樣理解,反反得正.即我們最終換的只是子段的位置,而不改變子段的順序,而我們先將子段逆序,再整體逆序最終結果是子段內順序的還原,
用數學表示
1、首先分為倆部分,x:abc,y:def;
2、x->x^t,abc->cba, y->y^t,def->fed。
3、(x^ty^t)^t=yx,cbafed->defabc,即整個翻轉。
附上**: a.
#include
#include
#define offset 3
void reverse(char *array,int b,int e);
int main()
printf("\n");
return 0;
}void swap(char *a,char *b)
void reverse(char *array,int length,int m)
int r=length%m; //乘下的字元個數
while(r--)
p1++;
p2++;}}
執行結果:efghijkljkabcd
總結:
這裡主要用到的是整體和個體的關係,即個體的劃分不是固定的,而是相對的.有些時候可以將幾個元素看成乙個整體處理.
陣列的移動靠的是交換,如果首尾交換成形逆序,相臨元素的交換則是順序移動,但如果兩次首尾交換,乙個子段,一次整段,剛可以實現塊的移動.
資料結構與演算法 字串
判斷乙個串是不是回文串,往往要分開編寫,造成 的拖沓 int longestpalindrome const char s,int n return max void longestpalindrome test 上面的迴圈中,對於回文長度本身的奇偶性,我們進行區別處理。這樣有點拖沓。我們根據乙個簡...
資料結構與演算法 字串
生成n對括號的所有合法排列 描述 給定乙個非負整數n,生成n對括號的所有合法排列。解答 該問題解的個數就是卡特蘭數,但是現在不是求個數,而是要將所有合法的括號排列列印出來。該問題和 程式設計之美 的買票找零問題一樣,通過買票找零問題我們可以知道,針對乙個長度為2n的合法排列,第1到2n個位置都滿足如...
資料結構演算法之字串
字串是由若干個字元組成,在c c 中常常使用 0 字元作為結尾,這樣很方便的為我們查詢到字串的最後乙個字元。為了節省空間,c c 常常將字串單獨放到乙個記憶體空間中,當幾個指標賦予相同的變數時,實際上他們會指向相同的位址空間 實現乙個函式將字串中的空格替換成 20 實現方式 方式一 如果是建立新的字...