1. 程式人生 > >程式設計題練習(4)

程式設計題練習(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;

}