程式設計題練習(4)
字串匹配演算法
法1:暴力匹配法。主串A(長度m),模式串B(長度n),串B逐位移動與串A比較。如果當前字元匹配成功(即A[i] == B[j]),則i++,j++,繼續匹配下一個字元;如果匹配失敗(即A[i]! = B[j]),令i = i - j + 1,j = 0,即每次匹配失敗時,i 回溯到上次開始匹配的下一個位置,j 被置為0。複雜度應該是O (m*n) 法2:KMP匹配。腦子笨,沒看懂。時間複雜度為O(m+n)。
字串比較函式C++實現
strcmp()函式是根據ACSII碼的值來比較兩個字串的;strcmp()函式首先將s1字串的第一個字元值減去s2第一個字元,若差值為零則繼續比較下去;若差值不為零,則返回差值。 自己編寫實現:
#include<iostream> #include<string.h> using namespace std; int cmpstr(char *s1,char *s2) { //int result; int i=0; while(s1[i]==s2[i] && s1[i]!=‘\0' && s2[i]!='\0') i++; return s1[i]-s2[i]; } int main() { char s1[20],s2[20]; int result; cin>>s1; cin>>s2; result=cmpstr(s1,s2); cout<<result<<endl; }
一個文件中出現次數最多的前三個單詞
思路:用Hash表,統計該文件中每個單詞出現的次數。對出現次數進行降序排序,則前三個資料即為,該文件中出現次數最多的前三個單詞。
實現字串拼接函式
法1:
#include<iostream> #include<string> using namespace std; string catstr(string s1,string s2) { //int result; int i=0; string s; s=s1+s2; return s; } int main() { char s1[20],s2[20]; string result; cin>>s1; cin>>s2; result=catstr(s1,s2); cout<<result<<endl; }
法2:
#include <iostream>
using namespace std;
char *my_strcat(char *str1, char *str2)
{
// str1="1234\0" str2="qwe\0"
char *p = str1;
while (*p != '\0') { p++; }// 使得p指向str1的'\0'的位置
*p = *str2;// '\0'的值設定為str2字串的第一個值
do
{
str2++;
p++;
*p = *str2;//逐次往後賦值
} while (*str2 != '\0');
return(str1);//使用指標操作的是地址,這就是為什麼返回了所得到的值!
}
int main()
{
char str1[6], str2[6];
cout << "input str1" << endl;
cin >> str1;
cout << "input str2" << endl;
cin >> str2;
cout << my_strcat(str1, str2) << endl;
return 0;
}
在執行方法2時,出現報錯。“stack around the variable “str1” was corrupted” 字元越界。 參考部落格:https://blog.csdn.net/ck1798333105/article/details/49913889/ 原因:這樣的錯誤是程式設計師在專案到了一定大的時候,它佔用的堆疊量就比較大。我也深有體會。因為自己本來編寫一個類,執行時沒有錯,但是在新增成員屬性的時候,在其它方式不變的情況下就容易發生這樣的錯誤。所以據此我猜應該是VS2005(2008)在內部就限定了堆疊的大小,當專案足夠大的時候,就會溢位。 解決方法:project->配置屬性->c/c+±>程式碼生成->基本執行時檢查 設定為預設值
一對兔子,從出生後第7個月起每3個月都生一對兔子。小兔子長到第3個月後每個月又生一對兔子。假如兔子都不死,請問第1個月出生的一對兔子,第n個月有多少隻兔子?
#include <iostream>
using namespace std;
int f(int n)
{
int r=0;
if(n<10)
{
r=1;
}
else
{
for(int i=1;i<=((int)(n/7)+1);i++)
{
r=r+i*f(n-7*i);
//r=r+1;
}
}
return r;
}
int main()
{
int n;
int r;
cin>>n;
r=f(n);
cout<<r+1<<endl;
}