1.本周學習總結
1.1思維導圖
1.2.談談你對線性表的認識及學習體會。
- 線性表主要分為順序存儲結構和鏈式存儲結構兩種。其中順序存儲結構主要運用的是我們比較熟悉的數組的寫法,而鏈式存儲結構則運用的是后來學的鏈表。在建表前,二者都需要對結構體先做定義。隨着學習的深入,調試的難度較之前也會大一些,沒辦法第一時間找到問題所在。經過pta的練習,能夠對一些常出現的問題進行總結:如指針域未置空,申請空間失敗,甚至是結構體名稱上出現問題(這個問題比較弱智,一般都是手滑按錯了)。本周的學習,pta上的題目是基於課本的分模塊訓練,對於插入刪除查找進行了一定的函數訓練,故而做到后面的編程題時,其實主要就是將前面的函數靈活結合運用。一開始寫pta還是脫離不了課本,但是后期該現象出現好轉,練熟分塊的函數,在編寫完整的程序時也會更得心應手一些。最大的體會是,對於程序當中每一句語句的意思都要自己捋清楚,強行硬套就像背題,脫離模板就會出錯。
2.PTA實驗作業
2.1.題目1:6-4 順序表操作集
2.1.1設計思路(偽代碼)
List MakeEmpty()
{
定義 L;
動態申請內存;
置空返回;
}
bool Insert(List L, ElementType X, Position P)
{
定義 i;
if 表滿||位置不合法
cout<< "FULL"||"ILLEGAL POSITION" ;
return false;
end if
for L->Last + 1 to P //倒序后移
L->Data[i] = L->Data[i-1];
end for;
L->Data[i] = X; //插入
L->Last++;
}
Position Find(List L, ElementType X)
{
定義i;
for i=0 to L->Last
找到直接返回位置
end for
}
bool Delete(List L, Position P)
{
判斷位置是否合法
定義 i;
for i=P to L->Last
}
2.1.2代碼截圖
2.1.3本題PTA提交列表說明。
1.編譯錯誤
- 不小心丟進去了c++的語法,然后發現只能用c來着
2.返回空表
- 置為空表時應該使L->last=-1
3.插入數據時,答案錯誤
- 要掌握好臨界值,確定初始化的L->last值,更改相應的變量(因為一開始寫的時候,是令L->last=0,后面改的時候就有漏改的情況)
4.答案錯誤
- 題目設置要求,在判斷條件的順序上面,經過幾次調試,輸出的答案會不太一樣,按照題目要求調整就可以啦
2.2 題目2 6-8 jmu-ds-鏈表倒數第m個數(單鏈表)
2.2.1設計思路(偽代碼)
way1
int Find(LinkList L, int m)
{
定義 nodeNum; //節點數
定義 p;
p = L; //p來動
while p = p->next != NULL
計數
end while;
if 位置!合法 return -1; end if
for i = 0 to nodeNum - m + 1 //L動
L移動
end for
return data;
}
way2
int Find(LinkList L, int m)
{
定義 i=1;
定義 p=L;
while p = p->next !NULL //鏈沒結束
跳過 m - 1 次;
then L 移動;
i++; //計數
end while;
if m 不合法 return -1;
返回 data
}
2.2.2代碼截圖
way 1
way 2
2.2.3本題PTA提交列表說明。
- 位置無效 段錯誤,答案錯誤
- 要增加一條位置判斷語句
if (m<1 || m>nodeNum)return -1; //非法返回
2.3 題目3 7-2 一元多項式的乘法與加法運算
2.3.1設計思路(偽代碼)
- 主要介紹倆函數
1.PlusResult
LinkList PlusResult(LinkList L1, LinkList L2)
定義 p1=L1->next, p2=L2->next, p3, temp, LPLus;
動態分配 LPlus並置空
p3 = LPlus; //保留頭節點
if !p1 相加為 p2; end if
反之 為p1;
while p1 &&p2
compare with indexes
if != 將較大的存入p3並后移
else factor相加后存入
end if
end while
剩余鏈接上;
2.MultResult
void MultResult(LinkList L1, LinkList L2, LinkList &LMult)
定義 p1=L->next, p2=L->next, p, temp;
while p1
新生成head並置空 //p2的函數是為了生成一個新的鏈表,然后用於加法函數,所以這個head每次都要新生成一下
p = head;
while p2
新生成temp並置空
factor 相乘 index相加
存入后移;
end while
p->next=NULL
LMult = PlusResult(head, LMult); //調用加法函數
初始化結點
end while
2.3.2代碼截圖
1.調用加法函數
2.3.3本題PTA提交列表說明
- Q:一開始寫加法函數,用了三個參數,在乘法當中調用函數則用了一個鬼畜的寫法,大概是這樣:PlusResult(L1,LMult,LMult);,程序出錯,乘法無法運行。
- A:是一種比較鬼畜的嘗試,經過這個之后中規中矩改寫了PlusResult函數,把函數類型改成LinkList,就能使函數上下通用了😁
- Q: 出現很奇怪的數字(一開始只寫加法函數的時候)
- A:整半天發現是index寫成了factor(尷了個尬),輸出就出錯了
- Q:還很經常出現這種情況(嘆氣不大會用vs來着)
- A:百度了一下解決方案,其實基本上就是寫的時候不小心或者沒考慮全,方案如下:0xCDCDCDCD錯誤解決方法是結構體要初始化。鏈表的末尾一定要保持指向NULL才能用tmp->next==NULL來判斷結尾,0xcdcdcdcd是一個未知值,新建的指針正好指向這個,但是不保證每次都是這個。所以,重點不是tmp的問題,而是tmp1->next=NULL。此時保證新建的尾節點只向NULL。
- Q:加法函數的做法會導致乘法結果的同類項不能合並:
- A:改用邊算邊插入的寫法(調不出來來着qaq🤦
3.1 題目
題目
L1-6 幸運彩票
彩票的號碼有 6 位數字,若一張彩票的前 3 位上的數之和等於后 3 位上的數之和,則稱這張彩票是幸運的。本題就請你判斷給定的彩票是不是幸運的。
輸入格式:
輸入在第一行中給出一個正整數 N(≤ 100)。隨后 N 行,每行給出一張彩票的 6 位數字。
輸出格式:
對每張彩票,如果它是幸運的,就在一行中輸出 You are lucky!;否則輸出 Wish you good luck.。
3.2 解題思路
兩種算法
- 1.比較容易想到的暴力方法(利用%和/,化為數字和),加減求和直接判斷寫法(這種做法很直接,但是略微有些笨
- 2.利用字符串,將輸入的數字以字符串的形式存取,通過ASCII碼值和的比較來判斷結果。
3.3 代碼截圖
3.4 學習體會
- 選取了天梯賽上的一道題目,是相對比較容易的一道題目。其實本來選取的是leecode上的一題很神奇地將時間復雜度從n3降到了n,不過是java的代碼(看不太懂來着,本來以為只是看起來比較復雜,實際上真的很復雜qaq,代碼如下。問了學姐,用到了hash樹的原理,因為哈希樹存的是鍵值對(看到這個程度我大概覺得自己應該是不能消化這一塊的內容了。不過這里用的一個思想也是將字符轉化為對應的ASCII碼然后用hash等方法簡便運算,所以就退而求其次找了天梯賽上的題目(代碼不難,主要是想讓自己記住字符轉數字的判斷方法
- 第三塊內容在尋找優秀代碼的過程當中,還是比較糾結的。leecode上面有帶題解的優秀代碼很多都是java或者python寫的,當然評論區也會有網友們的一些寫法也值得參考。在尋找過程當中,也嘗試去找vector等stl容器的源碼(尋思着掌握了比較好理解來着)但是太長了就有點自閉(尋思着下一次爭取看一些源碼叭,本學期打算先從一些比較簡便的算法學起,再掌握源碼,語法等。