值大三開學之際,選修演算法分析與設計一課,開啟部落格記錄下自己的學習足跡,以期於過程中加深心得
本系列所選題目皆來自於leetcode**,首先嘗試的是以小端模式單向鍊錶儲存的大數加法,問題描述如下
資料型別以及介面已經定義好
/**
* definition for singly-linked list.
* struct listnode
* };
*/
class solution
};
鍊錶非空,數字非負,小端模式儲存也很符合加法從低位開始的豎式計算。直接new出乙個listnode例項,記錄下位址用於返回,從最低位起逐個相加並儲存結果
listnode* rst = new listnode(0);
listnode* rtn = rst;
while (l1->next != null && l2->next != null)
這裡特意留出最高位用於之後的進製處理。考慮到兩個加數的位數可能不相等,最高位有無進製對之後的操作有一定影響,故而進行了分類討論
rst->val = rst->val + l1->val + l2->val;
if (rst->val > 9)
rst->val += over->val;
if (rst->val > 9)
}} else }}
最後將首位址rtn返回即可
題目看似不難,但若在進製操作中未考慮到所有可能的情形,極容易出現謬誤。同時也是侷限於我的思考框架,**看起來有些冗長。為此我fork乙份比較優秀的solution以供學習參考
listnode *addtwonumbers(listnode *l1, listnode *l2)
return prehead.next;
}
該解法設定了數值為0的頭結點,運用到了計算機二進位制加法器中的sum位和carry位,?表示式的靈活運用使得**整體十分簡潔有力。
第一大周總結2 2018
這是第二個第一大周總結了,一不小心就過去一年又回來上學了。總結還是少點感慨好,趕緊切入正題。這個大周的課比較少,所以。沒什麼所以,只是有點可惜。這個大周一沒刷多少題,二考試還沒考好嗚 我可活個什麼勁!當然這是個總結,不是訴苦,所以還是來講講問題。問題 1.速度慢,打字,思考,實現的速度慢的不行,主要...
演算法設計周記(六) Summary Ranges
對於給定的陣列,求出其整數範圍。如果從集合表示的角度來看待問題的話,可以理解成將列舉法轉化為描述法。所給陣列已經做好了公升序排列,那麼只用順序遍歷一次,把每乙個連續的整數串用字串返回即可。class solution else i end 1 return res 這種解法比較常規,時間複雜度為o ...
演算法設計周記(十) 棧
給定乙個擁有固定格式的字串n s 將其解析成ss s 重複n次 的形式。這題涉及到符號匹配,可以考慮使用棧這一filo的資料結構來幫助解決問題。因為數字必定表示倍數,不會是轉換後的字串的內容,所以遍歷字串遇到數字時,將其轉換成整數形式存在int棧內 若是讀到字母,將其存入快取字串 符號意味著重複字串...