一、PTA實驗作業
題目一:7-1 最長連續遞增子序列
給定一個順序存儲的線性表,請設計一個算法查找該線性表中最長的連續遞增子序列。例如,(1,9,2,5,7,3,4,6,8,0)中最長的遞增子序列為(3,4,6,8)。
1、設計思路
/*求最長遞增子序列*/
定義變量 position 、len 記錄子列的開始位置和長度
定義變量 maxposi 、maxlen 記錄最長遞增子列的位置和長度
while i < L->length
do
if 不為遞增
then 重新記錄子列初始位置和長度
else len++
if 當前長度 > 最大長度
then maxposi、maxlen ← position、len
end
for 0 to maxlen
順序表 L ← 最長遞增子列
end
L 的長度 ← maxlen
2、實驗代碼
- 主函數
- 求最長遞增子列
3、 遇到問題及解決方法
- 編譯錯誤:用 c 的編譯器運行 c++ 文件
解決方法:將上傳選項改為 c++ - 答案錯誤:隨機最大 n 的測試點過不去
解決方法:將#define MAXSIZE 100000
改為#define MAXSIZE 100001
防止數據溢出
題目二:7-3 兩個有序序列的中位數
已知有兩個等長的非降序序列S1, S2, 設計函數求S1與S2並集的中位數。
1、設計思路
- 1)合並鏈表
- 2)輸出合並鏈表的第 n 個數 ( n 為單個鏈表的表長 )
/* 鏈表的合並 */
定義指針變量 p1 指向 L1
定義指針變量 p2 指向 L2
while p1 不空 and p2 不空
do
if ( p1->data ≤ p2->data )
then L ← p1
else L ← p2
end
L ← 剩余的 L1 or L2
2、實驗代碼
- 主函數
- 鏈表合並
- 求中位數
3、 遇到問題及解決方法
- 運行超時:多寫了對單個子列的排序函數
解決方法:子列本為非降序,無需排序 - 編譯錯誤:函數的聲明放在了結構體之前,導致 List 未定義
解決方法:將函數聲明置於結構體定義之后
題目三:7-2 一元多項式的乘法與加法運算
設計函數分別求兩個一元多項式的乘積與和。
1、設計思路
/*多項式加法*/
定義結構體指針 ha hb 分別指向 鏈表 a b
定義結構體指針 c 用於存儲新鏈表
定義整型變量 temp 用於判斷系數是否為零
while a不空 and b不空
do
if ha->index ≠ hb->index
then 按順序存入新鏈表
else 合並同類項
end
if a不為空 or b 不為空
then c ← 剩余結點
返回 c
/*多項式乘法*/
定義結構體指針 ha hb 分別指向 鏈表 a b
定義結構體指針 c 用於存儲新鏈表
定義 tmpC 暫存 乘法運算結果
if a空 or b空
then 返回空的 c
while ha
do 遍歷乘以 b 中元素
end
調用加法函數,進行合並同類項,並將結果賦於 c
返回 c
2、實驗代碼
- 主函數
- 多項式加法
- 多項式乘法
3、 遇到問題及解決方法
- 答案錯誤:沒有考慮同類項合並問題
解決方法:增加了指數相同,系數相加的代碼行 - 段錯誤:在
if ( p ->coeff > p->next->coeff )
時沒有判斷 p->next 是否存在
解決方法:將循環條件while ( p )
改為while ( p->next )
- 答案錯誤:系數為零時不輸出
解決方法:判斷系數非零時才加入新鏈表中
二、截圖本周題目集的PTA最后排名
- 1.順序表PTA排名
- 2.鏈表PTA排名
- 3.我的總分:2.5
2.5分(必做題全部做完,選做題做部分 )
本周學習總結
1、數據結構的學習時間和自我感覺
- 本周數據結構學習時間:對於數據結構的學習時間基本都花在打 PTA 上 ,PTA 的內容有很多不懂,花了很多時間。
- 對自己的安排不滿意,覺得這樣效率不高,但是 PTA 又要完成,有點趕鴨子上架的感覺。
- 對於不懂的問題,一般問同學或者是百度。
- 應該做出的改變:先鞏固基本知識,再來做實際編程。
2、對線性表的認識
- 順序表 & 優點: 對數據的訪問方便,無需未表示表中元素邏輯關系而占用內存
缺點:插入和刪除元素需要大量移動元素 ; 無法充分利用零碎空間,容易造成空間浪費 - 鏈表 & 優點:在插入、刪除元素時只需要對單個結點進行操作,不需移動元素
缺點:在訪問數據時需要遍歷,存儲密度較小