這周學習了線性表,它有兩種存儲方式,一種順序儲存,用的是數組,另外一種是鏈式存儲,用的是鏈表。恍惚想到上學期的課設,也是兩種方法完成,一種用數組,一種用鏈表。
線性表是一對一的結構,能夠做爲存放數據的容器,並且能夠用它的基本操做來完成更復雜的功能。
在完成pta時,順序表部分的比較熟悉,作到鏈式的時候,由於對鏈表不是很熟悉,作得一臉懵逼,一邊寫一邊看書或者問舍友
而後花了一個晚上把線性表從新看了一遍,終於比較懂它在講什麼了,莫名欣慰python
設計一個算法,從順序表中刪除重複的元素,並使剩餘元素間的相對次序保存不變
定義變量i,j=0,i當data數組的下標,j當重構data後的下標 定義一個hash數組,而且初始化爲0 遍歷整個順序表 將L->data[i]的值做爲hash數組的下標,而且統計其出現的次數 if L->data[i]所在的下標i對應出現的次數是第一次 將這個值存入重構的data數組裏,其下標j加一 讓L->length爲j,即它的新長度
Q1:部分正確是空表這個測試點錯了,題目沒有要求空的時候要給出什麼提示,可是我加了個輸出error就錯了
A1:修改了一下輸出線性表的函數就過了
Q2:在老師講這道題以前,就是用的是哈希數組來查找,可是個人代碼好像沒有真正改到L,但它仍是讓我過了
A2:老師講了以後,而且在舍友的發現下,發現個人代碼是錯的(雖然它過了),並對它進行了修改面試
已知一個帶有表頭節點的單鏈表,查找鏈表中倒數第m個位置上的節點
定義兩個LInkList類型的指針,一個爲pre做爲遍歷L的指針,一個爲p做爲指向第m個元素的指針,定義整型變量i,用來記數 pre指向首結點,q爲空 while p還沒到尾部而且傳入的m大於0 do 記數的i開始自增 if 恰好移到第m個數 q開始從首結點移動 if 移到第m個數以後 q開始指向下一個結點,即日後移 pre在循環過程當中,一直日後移 end while if q爲空,即傳入的m無效 返回-1 else 返回q指向的data的值
Q1:一開始的運行超時是while裏面忘記讓用來遍歷的pre指針日後移了,致使while出不來,就運行超時了,一個低級錯誤 A1:添加了一個pre=pre->next Q2:而後問題又來了,出現了段錯誤,其實一直不是很懂段錯誤是什麼樣的錯誤,好像有不少種,棧溢出或者數組越界什麼的,我這裏的錯誤應該是添加的pre=pre->next放錯位置了,一進while裏,還沒記數就讓它日後移了 A2:因而我把它移到while裏的最後一句,其實以前對在循環裏面的語句順序一直不覺得意,如今發現仍是差不少的 Q3:而後是部分正確,有個位置無效的測試點過不了假如它的m小於0,仍是能夠進個人while裏而且也能讓p日後移,這樣就會致使答案錯誤了 A3:因而在while的判斷條件里加了個m>0,這樣的話,m若是小於0,就直接到判斷q是否爲空,直接返回-1了
已知兩個遞增鏈表序列L1與L2,2個鏈表都是帶頭結點鏈表。設計函數實現L1,L2的合併,合併的鏈表仍然遞增有序,頭結點爲L1的頭結點。 合併後須要去除重複元素。
定義LinkList類型的指針,Ptr1爲L1的遍歷指針,Ptr2爲L2的遍歷指針,temp爲保存L1的指針 Ptr1指向L1的首結點 Ptr2指向L2的首結點 重構L1,而且用temp保存L1 while Ptr1&&Ptr2 do if Ptr1指向的data大於Ptr2指向的data temp的後繼結點指向Ptr1,Ptr1繼續日後移 else if Ptr1指向的data小於Ptr2指向的data temp的後繼結點指向Ptr2,Ptr2繼續日後移 else temp的後繼結點指向Ptr1,Ptr1,Ptr2一塊兒日後移 temp日後移 end while if Ptr1 將Ptr1剩下的接到temp的後繼結點上 if Ptr2 將Ptr2剩下的接到temp的後繼結點上
Q1:編譯錯誤,又是簡單的小問題,不當心把Ptr的後繼結點指向了Ptr的data了,一開始還沒反應過來,連交了幾回 Q2:部分正確,就只有那個空表的測試點過了, 另外兩個都運行超時了,作的時候對鏈表還不是很瞭解,就是看着書,用尾插法把符合的接到L1上,可是好像和書上的代碼不太同樣,致使運行超時了 A2:後來嘗試着註釋掉幾個語句,就一不當心就過了,幸福來得太忽然了。我註釋掉的語句是讓temp等於Ptr,像尾插法那樣,後來發現這樣作的話,temp就會一會指這個,一會指那個的,整個都亂掉了
找一份優秀代碼,理解代碼功能,並講出你所選代碼優勢及能夠學習地方。主要找如下3種類型代碼:算法
讀源碼,如從python或C++中找用線性表封裝的庫源碼,分析代碼功能及能夠學習地方。
考研題種關於線性表內容。能夠找參加過考研的學長學姐拿。尤爲是想要考研同窗,能夠結合本章內容,用考研題訓練學習。
ACM、PTA天梯賽、leecode面試刷題網站,找線性表相關題目閱讀分析。
請按照下面內容填寫代碼閱讀內容。請未必認真完成,若是發現應付,沒有介紹代碼思路、體會等扣分。數組
集合A比較與集合B的交集
將要比較的集合傳入函數,另外一個是用來返回狀態的類型//(用於判斷contains) 得到當前對象的全部函數 定義r=0,用來遍歷元素,定義w=0,用來標記兩個集合公共元素的個數 定義狀態爲false,用來返回是否有交集的狀態 遍歷A集合 判斷B集合中是否包含集合A中的當前元素//(用contains的判斷,若是返回true則有包含集合B) if 包含則直接保存 將數值複製給數組,讓w++ if r的值比size小//(contains拋出錯誤) 複製剩餘的元素 調用system.arrraycopy(第一個參數爲源數組,第二個參數爲源數組要複製的起始位置,第三個參數爲目的數組,第四個參數爲目的數組放置的起始位置,最後一個參數爲複製的長度) w爲當前集合A的長度 end if if 集合A的大小發生變化//(w不等於size,即有交集) 遍歷交集裏的元素 將null賦值給元素 記錄集合中元素的改變 設置當前數組的大小//size=w; 狀態改成true end if 返回狀態
找這份代碼找了挺久的,也不知道找什麼,看了力扣的線性表題,中等題和困難題大部分都沒有題解,就放棄了 後來去找list的源代碼,找到了這個找交集的,恰好和pta考試那個有點像,那個是用鏈表作的,這個用的是數組 這個源代碼調用了一些其餘函數,例如contains和arraycopy,若是沒有去搜一下還真不知道在表達什麼 發現又不少步驟都有已經寫好的函數能夠調用,只要知道它怎麼傳參,就差很少會用了 我以爲這個代碼值得我學習的有 清除的這個步驟,它沒有用移動數組來清除,而是直接將null賦值給它了 在判斷集合A是否包含集合B時,不是用兩重遍從來判斷,而是調用了函數來實現,時間複雜度爲O(n),這個函數能夠學習下來