鑑於一線碼農的演算法博文基本通過c#完成,此處用c++再實現一遍,具體解法可參考其博文。
1.百錢買百雞(降低時間複雜度)
voidnumofhen_1()}}
}void
numofhen_2()
}
2.五家五井(不定方程組,運用資料為整數特性)
**省略,詳情見一線碼農相應部落格。
3.猴子吃桃(尾遞迴)
題目:猴子第一天摘下若干個桃子,當即吃了一半,還不過癮就多吃了乙個。第二天早上又將剩下的桃子吃了一半,還是不過癮又多吃了乙個。
以後每天都吃前一天剩下的一半再加乙個。到第10天剛好剩乙個。問猴子第一天摘了多少個桃子?
int sumpeach1(intday)
void
numofpeach_1()
//尾遞迴(劍指offer上有類似題目,判定二叉樹是否平衡)
int sumpeach_2(int day, int
sum)
void
numofpeach_2()
尾遞迴將每次計算結果進行傳遞,但是具體效果得看編譯器是否進行了相應優化。
此題還有更為簡單的做法,具體為參考每次計算數值的規律性,與2的次方存在對應關係。
4.尋找最長公共子串行(順序,可以非連續)
void sub_str(unsigned char** mat, constint 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(constint 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, conststring&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(conststring& 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...