Code Smells

Bloaters 長い関数(Long Method) オブジェクトそのものの受け渡し、関数の抽出、コマンドによる関数の置き換え、問い合わせによる一時変数の置き換え、条件記述の分解、パラメータオブジェクトの導入、ポリモーフィズムによる条件記述の置き換え、ループの分離 巨大なクラス(Large Class) クラスの抽出、サブクスによるタイプコードの置き換え、スーパークラスの抽出 データの群れ(Data Clumps) オブジェクトそのものの受け渡し、クラスの抽出、パラメータオブジェクトの導入 長いパラメータリスト(Long Parameter List) オブジェクトそのものの受け渡し、関数群のクラスへの集約、問い合わせによるパラメータの置き換え、パラメータオブジェクトの導入、フラグパラメータの削除 基本データ型への執着(Primitive Obsession) オブジェクトによるプリミティブの置き換え、クラスの抽出、サブクラスによるタイプコードの置き換え、パラメータオブジェクトの導入、ポリモーフィズムによる条件記述の置き換え Tool Abusers Switch Statements 相続拒否(Refused Bequest) 委譲によるサブクラスの置き換え、委譲によるスーパークラスの置き換え、フィールドの押し下げ、メソッドの押し下げ クラスのインターフェース不一致(Alternative Classes w/ Different Interfaces) 関数宣言の変更、関数の移動、スーパークラスの抽出 一時的属性(Temporary Field) 関数の移動、クラスの抽出、特殊ケースの導入 Change Preventers Divergent Change 変更の分散(Shotgun Surgery) 関数群のクラスへの集約、関数群の変換への集約、関数の移動、関数のインライン化、クラスのインライン化、フィールドの移動、フェーズの分離 Parallel Inheritance Hierarchies Dispensables Lazy Class 疑わしき一般化(Speculative Generality) 関数宣言の変更、関数のインライン化、クラス階層の平坦化、クラスのインライン化、デッドコードの削除 データクラス(Data Class) 重複したコード(Duplicated Code) 関数の抽出、ステートメントのスライド、メソッドの引き上げ Couplers 特性の横恋慕(Feature Envy) 関数の移動、関数の抽出 Inappropriate Intimacy メッセージの連鎖(Message Chains)...

February 17, 2022

Longest Palindromic Substring

https://leetcode.com/problems/longest-palindromic-substring/ class Solution: def longestPalindrome(self, s: str) -> str: res = '' for i in range(len(s)): # odd case tmp = self.helper(s, i, i) if len(tmp) > len(res): res = tmp # even tmp = self.helper(s, i, i+1) if len(tmp) > len(res): res = tmp return res def helper(self, s, l, r): while l >= 0 and r < len(s) and s[l] == s[r]: l -= 1 r += 1 return s[l+1:r]

December 12, 2021

Longest Increasing Subsequence

https://leetcode.com/problems/longest-increasing-subsequence/ LIS はどんな場合でも最低1になるので、 1を入れた、list を作る。 reverse order でループし、 ネストしたループで最初にループしている i 以降の数と比較する。 nums[i] と nums[j] で nums[i] が小さい場合、 subsequence となるので、 LIS[i] に max(LIS[i], 1 + LIS[j]) を入れる。 j は i 以降の数字を見ているので、max()を使わないと LISの最後の 1 で置き換えて 2 となってしまうので注意。 class Solution: def lengthOfLIS(self, nums: List[int]) -> int: LIS = [1] * len(nums) for i in range(len(nums) - 1, -1, -1): for j in range(i + 1, len(nums)): if nums[i] < nums[j]: LIS[i] = max(LIS[i], 1 + LIS[j]) return max(LIS)

December 12, 2021

Longest Common Subsequence

https://leetcode.com/problems/longest-common-subsequence/ 2d grid を作る。 row, col にそれぞれ、1行、1列追加して 0 を入れる。 grid の右下からループし、 縦横が同じ文字でマッチしたら、斜め左上に進む。 その際に1を足す。 マッチしなかったら、右横か下のどちらか大きい数字を入れる。 ループが終わりgrid[0][0] の箇所に 1番長い subsequence の数が入る。 class Solution: def longestCommonSubsequence(self, text1: str, text2: str) -> int: dp = [[0 for j in range(len(text2) + 1)] for i in range(len(text1) + 1)] for i in range(len(text1) - 1, -1, -1): for j in range(len(text2) - 1, -1, -1): if text1[i] == text2[j]: dp[i][j] = 1 + dp[i + 1][j + 1] else: dp[i][j] = max(dp[i + 1][j], dp[i][j + 1]) return dp[0][0]

December 11, 2021

Traverse a Tree

F / \ B G / \ \ A D I / \ / C E H Pre-order Traversal root left subtree right subtree F B A D C E G I H https://leetcode.com/problems/binary-tree-preorder-traversal/ Iterative approach class Solution(object): def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]: """ :type root: TreeNode :rtype: List[int] """ res, stack = [], [(root, False)] while stack: node, visited = stack.pop() if node: if visited: res.append(node.val) else: stack....

October 22, 2021