Leetcode第2題思考過程分析:耗費的時間與思考過程
1、 審題耗費了很長時間,英文看不懂。兩個單鏈表代表了兩個整數,整數逆序,(2 -> 4 -> 3) + (5 -> 6 -> 4),(2 -> 4 -> 3)表示342,另一個數是456,和為708;巧合的是243+564=807,這個巧合不能用來解題。
2、 解題的初步思路是逆序鏈表,將數字存在普通數組里(這需要動態數組,因為輸入的鏈表長度未定),然后相加,再把sum分解為各位數字,逆序存入單鏈表(這一步令我困惑的是對兩個鏈表的操作有重復的,想着能不能簡化,其實順序訪問鏈表存入數組是可行的)。這個時候我已有的知識是:sum%10這樣的操作可以得到個位數。
3、 思考ListNode* l1是如何存這些數字的,l1是不是為空的頭指針。其實第一個節點就存了(2 -> 4 -> 3)的2。
注意鏈表里有個函數,所以new ListNode(n)可以初始化一個節點,next置為NULL
4、 下面是代碼各部分當時的思考分析
0:考慮鏈表有沒有頭指針,(2 -> 4 -> 3),l1節點存的2;
1:想着declare一個ListNode指針有兩種寫法
2:順序遍歷鏈表,不用new的數組,vector添加元素有push_back,想了下有沒有push_front,vector為了效率,不支持,又考慮用insert操作。
4:從數字轉換為int,vector存的順序為(2 -> 4 -> 3),用正向iterator首先得到低位2,但用num1=num1*10+*it迭代需要先從3開始,由此用reverse_iterator.
步驟2和4因為有兩個鏈表,需要重復這兩步,考慮過如何簡化,又把2考慮為鏈表逆序,不用vector,只用指針操作,其實多想了
5:對和需要分解為各位數字,並用創建的新鏈表接收。考慮了while條件為numSum!=0,
該如何寫循環語句,是用尾插法還是頭插法,還把newSum=newSum/10寫成newSum=newSum%10。
第五步耗費了大量時間,總是想不清楚,感覺很混亂,因為並沒有訪問鏈表時p=p->next這種現成的語句。
3、原本寫成int,submit報錯如下:測試 [9,1999999999]不通過,得到的結果很奇怪。
Num2的值為1410065399,不是應該為9999999991嗎?為了檢測程序中的錯誤,添加了很多cout語句。看4部分代碼,沒錯啊。其實問題不是出在4,而是整形溢出了,查了int最大值,比9999999991小。把num1和num2改為long型的,又遇到了錯誤,這個時候我才意識到test case中有大數,連long long都裝不下。需要用大數計算。
審題花費時間,然后是想出整體解決思路,實現整體思路中的步驟,每個步驟可能有多種寫法(這是個廣度搜索過程),前步驟又影響后步驟(這是個深度搜索思考過程,如果進行不下去了,會回到某點),如果遇到想不清細節的部分就會很耗時間。代碼需要考慮整體,而腦力又只夠思考局部。