第2章學習線性表的順序表示和鏈式表示,及二者在不同情況下的時間複雜度,空間複雜度。 由於一開始是學習二者的基本操作,要組合起來實際寫一個完整程式時,連接處磕磕碰碰,不知從何入手,最後參考老師給的代碼學習了基本寫法。在一道求逆轉鏈表的填空題時,完全不會,找了各方資料,最後也是在一篇博客中(https: ...
第2章學習線性表的順序表示和鏈式表示,及二者在不同情況下的時間複雜度,空間複雜度。
由於一開始是學習二者的基本操作,要組合起來實際寫一個完整程式時,連接處磕磕碰碰,不知從何入手,最後參考老師給的代碼學習了基本寫法。在一道求逆轉鏈表的填空題時,完全不會,找了各方資料,最後也是在一篇博客中(https://www.cnblogs.com/puyangsky/p/5337050.html)釐清其中道理。還有在求交集的那道題中,就是由於方法不是最優,PTA總是顯示運行超時,最後是向同學求助,才學習到了我所沒想到的方法。
大概是目前做題經驗不足,在很多問題上要思考許久,另外對代碼不太熟悉,不能完全獨立打下來,總是翻書看。
接下來希望寫代碼可以脫離教材,對代碼更熟悉,還有就是在解決問題的時候可以多思考有沒有其它思路,是否為最優解。
求交集:
#include <iostream>
#include <algorithm>
using namespace std;
#define MAXSIZE 100000
typedef int ElemType;
typedef struct
{
ElemType elem[MAXSIZE];
int length;
}SqList;
int main()
{
SqList a,b,c; //定義SqList類型的變數a,b,c
int n,m,i=0,j=0;
int num=0;
int x=0;
cin >> n>>m;
if ( (n > MAXSIZE) || (m > MAXSIZE) ) //n值超出範圍,程式退出
return 0;
for ( int i = 0; i < n; i++ ) //輸入集合a的元素
cin >> a.elem[i] ;
for ( int i = 0; i < m; i++) //輸入集合b的元素
cin>>b. elem[i];
sort(a.elem,a.elem+n); //調用函數sort對集合a進行從小到大排序
sort(b.elem,b.elem+m); //調用函數sort對集合b進行從小到大排序
while(i<n && j<m)
{
if(a.elem[i]<b.elem[j]) //因為集合a,b已經排好序,選擇a中下一個不小於當前元素的元素與b當前的元素比較
i++;
else if(a.elem[i]>b.elem[j]) //選擇集合b中下一個元素與a的當前元素比較大小
j++;
else if(a.elem[i]==b.elem[j])
{
c.elem[num]=a.elem[i]; //將共有的元素存在集合c中
num++;
i++; //兩集合都向後繼續比較
j++;
}
}
cout<<num<<endl; //輸出交集中元素的個數
for(int i=0;i<num;i++) //輸出交集中的元素
{
if(i==0)
{
cout<<c.elem[i];
}
if(i!=0)
{
cout<<" "<<c.elem[i];
}
}
return 0;
}