經典演算法C 版(參考一線碼農博文)

2022-01-15 11:56:10 字數 3160 閱讀 9452

鑑於一線碼農的演算法博文基本通過c#完成,此處用c++再實現一遍,具體解法可參考其博文。

1.百錢買百雞(降低時間複雜度)

void

numofhen_1()}}

}void

numofhen_2()

}

2.五家五井(不定方程組,運用資料為整數特性)

**省略,詳情見一線碼農相應部落格。

3.猴子吃桃(尾遞迴)

題目:猴子第一天摘下若干個桃子,當即吃了一半,還不過癮就多吃了乙個。第二天早上又將剩下的桃子吃了一半,還是不過癮又多吃了乙個。

以後每天都吃前一天剩下的一半再加乙個。到第10天剛好剩乙個。問猴子第一天摘了多少個桃子?

int sumpeach1(int

day)

void

numofpeach_1()

//尾遞迴(劍指offer上有類似題目,判定二叉樹是否平衡)

int sumpeach_2(int day, int

sum)

void

numofpeach_2()

尾遞迴將每次計算結果進行傳遞,但是具體效果得看編譯器是否進行了相應優化。

此題還有更為簡單的做法,具體為參考每次計算數值的規律性,與2的次方存在對應關係。

4.尋找最長公共子串行(順序,可以非連續)

void sub_str(unsigned char** mat, const

int i, const

int j, const

string& s,string&substr)

else}//

注意此處是尋找順序的最長公共子串行(可以非連續)

void lengthofsubstr_1(const

string& s1, const

string&s2)

//此處其實無需全部初始化,初始化邊界元素即可

for (i = 0; i < len1 + 1; i++)

for (j = 0; j < len2 + 1; j++)

//填充矩陣

for (i = 1; i < len1 + 1; i++)

else

else}}

}string substr; //

將最長公共子串行輸出

sub_str(signmat, len1, len2, s2, substr);

std::reverse(substr.begin(), substr.end());

cout

<< "

最大公共子串行長度為:

"<< matrix[len1][len2] << "

;最長字串為:

"<< substr

for (i = 0; i < len1 + 1; i++)

delete

signmat;

delete

matrix;

}

個人建議還是將中間過程進行輸出,這樣方便理解,最好是看下面**的**。

不過部落格裡面的**初始位置應該為0,自己輸出中間變數的就會比較清楚。漂亮的解法。

5.字串相似度

對於兩個字串a和b,通過基本的增刪改將字串a改成b,或者將b改成a,在改變的過程中我們使用的最少步驟稱之為「編輯距離」。

雖然沒太看懂,不過這個解題思路和上面類似,僅僅是初始化方式進行了改變,意義完全不一樣了,贊

int minofthree(const

int x1, const

int x2, const

intx3)

int sameofstr(const

string& s1, const

string&s2)

else}}

int res =matrix[len1][len2];

for (i = 0; i < len1 + 1; i++)

delete

matrix[i];

delete

matrix;

//返回字串的編輯距離

return

res;

}

6.kmp演算法(暫時未理解)

void getnextval(int next, const

string&str)

else

}}//

s1為主串,s2為子串

int kmp(const

string& s1, const

string&s2)

int *next = new

int[len2];

memset(next,

0, sizeof

(next));

getnextval(next, s2);

while (i < len1&&j else

}delete

next;

if (j ==len2)

return i -len2;

else

return -1

;}

7.改進版kmp演算法

void getnext(const

string& t,int

next)

else

}}//

pos表示從主串的第pos個位置進行匹配

int kmp(const

string& s, const

string& t, int pos = 0

)

else

}delete

next;

if (j ==t.length())

return i -t.length();

else

return -1

;}

8.華為機試題目,猴子分桃

//

猴子分桃演算法

long

long numofpeach(int

n)

else

break

; }

if (j ==n)

break

; }

return

i;}

經典排序演算法 C 版(上)

提起排序,與我們的息息相關,平時開發的 少不了排序。經典的排序演算法又非常多,我們怎麼評價乙個排序演算法的好壞呢?其實可以這樣想,要細緻的比較排序演算法好壞,那我們就從多方面盡可能詳細的對比 一 效率方面 1 排序演算法的執行效率 最好 最壞 平均 2 我們之前捨棄的時間複雜度的係數 常量 低階,在...

C 經典演算法題 格雷碼(Gray Code)

gray code是乙個數列集合,每個數使用二進位來表示,假設使用n位元來表示每個數好了,任兩個數之間只有乙個位元值不同,例如以下為3位元的gray code 000 001011 010110 111101 100由定義可以知道,gray code的順序並不是唯一的,例如將上面的數列反過來寫,也是...

C 經典演算法題(一)

1.實現strcpy.char mystrcpy char pdest,const char psrc if pdest psrc char piter pdest strlen pdest while piter psrc 0 return pdest 3.實現cstring字串類預設四個方法 c...