發表文章

GRASP 模式

leetcode 演算法

 Kadane's Algorithm 動態規劃常常適用於有重疊子問題和最佳子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。 重疊子問題 https://magiclen.org/dynamic-programming-basic/ 記憶法(Memoization)與製表法(Tabulation) Top-down:記憶法(Memoization) 通常用遞迴 Bottom-up:製表法(Tabulation) 通常用for 從 0 到 n 最優子結構: https://www.youtube.com/watch?v=JWTqsNvtwP4&ab_channel=GeeksforGeeks

系統奇怪狀況紀錄

1. 有一個折扣列表,分為前台可見跟後台可見,兩個地方看到的折扣列表不一樣須在資料庫設定visible欄位用1、0區分,需要兩種query撈資料。 2. laravel 返回到 view 的東西,array、object 混雜。 3. 需要去大量的table撈資料,還需整合第3方來源的資料。 4. function 有多種可能的返回格式。

面試題

Difference between socket and websocket? Difference between subroutine , co-routine , function and thread? interface 和 abstract class static 關鍵字 javascript 閉包 let const var 變數提升 mysql left join right join inner join

java leetcode 小技巧

http://hilite.me/ ===========  return new int[] { i, j }; 可以直接產生結果。 ========== StringBuilder res = new StringBuilder() String Builder可以創建動態長度的string,並可以串接不同型態的變數,都會轉成字串。 toString 轉成 String 型態。 ========== String a = "aa"; a.charAt(0) 可以從字串拿值。 ========== 給int x; char str[] = Integer . toString(x) . toCharArray(); 可以把數字轉成 str array。 ========== int  m = (l + r) >>  1 ; 等價於 int  m = (l + r) / 2; ========== 二維陣列動態規劃起手式 // 宣告array長度的dp boolean [][] dp = new boolean [ arr . length ][ arr . length ]; // 將對角線初始化 for ( int a = 0 ; a < arr . length ; a ++) { dp [ a ][ a ] = true ; } // 產生不同間隔 // length = 5 /* 間隔1 0 1 1 2 2 3 3 4 間隔2 0 2 1 3 2 4 間隔3 0 3 1 4 間隔4 0 4 */ for ( int a = 0 ; a < arr . length ; a ++) { for ( int b = 0 ; b < arr . length - a - 1 ; b ++) { int diff = b + a + 1 ; } }

MVC理解

https://stackoverflow.com/questions/5863870/how-should-a-model-be-structured-in-mvc/5864000#5864000 https://stackoverflow.com/questions/16356420/mvc-for-advanced-php-developers/16356866#16356866 https://nikic.github.io/2011/12/27/Dont-be-STUPID-GRASP-SOLID.html  MVC為一個設計模式,Model為一個層,不是一個物件或是一個class,包含業務邏輯跟資料存取,Controller為一個交互層,只負責接收進來的資料,傳到Model做處理,所以Controller只是薄薄的一層,View為顯示介面,不包含計算邏輯。 Model包含三個部分: Domain Objects:      表示業務邏輯的物件。 Data Mappers:      資料持久化,不管來源從哪邊來,可能是DB、API、檔案。 Services:      Domain Objects和Data Mappers的交互層,可以避免一些Domain Object的業務邏輯進入Controller。

物件導向

圖片
抽象 只提供基本資訊,隱藏不必要的資訊。 降低設計的難度 封裝 隱藏實作細節 裡面的數據不提供給外部對象使用 外部對象只能通過接口溝通 繼承 被繼承的類叫基類,繼承的類叫子類。 基類應為一個抽象概念,為一個抽象類,代表不應直接實例化基類。 子類有基類的功能跟數據,減少重複。 多型 子類代替父類。 傳入參數定義成父類,傳入子類達到不同功能。 父類為抽象,符合針對抽象編程。 類的關係 aggregation association dependency composition inheritance (generalization) implementation (Realization) association 為 has a 的關係,A has a B 代表,A class 有一個成員變數為 B。 程式碼為 : class A {     B b; } dependency 為 A references B (use a) 的關係,A references B 代表 A 在某個 function 內有用到 B,A 使用 B 的操作,但卻不擁有 B,可能是: 通過參數傳入 直接 new  返回值 靜態function 全域對象、變數、function 程式碼為 : 參數傳入 class A {     function t1(B b) {      } } 或直接 new class A {     function t1() {          B b = new b();      } } 或返回值 class A {     function t1() {         return new B();     } } aggregation 也是 has a (own a) 的關係,為 association 的子集,為較弱的 association ,A 聚合 B 代表,A 擁有 B,但是 B 可以獨立運作。 程式碼為 : class A {   ...