復(fù)盤|第356場周賽
滿足目標(biāo)工作時長的員工數(shù)目
【遍歷】統(tǒng)計多少數(shù)字大于target。
統(tǒng)計完全子數(shù)組的數(shù)目
【滑動窗口】枚舉右端點,如果[l, r]]是完全子數(shù)組,那么[0, r], [1, r],..., [l- 1, r]也是完全子數(shù)組(子數(shù)組不同元素個數(shù)已經(jīng)達到最大值),所以以r為右端點時,滿足條件的子數(shù)組有l(wèi)+1個。
包含三個字符串的最短字符串
【暴力枚舉】為了答案最短,三個字符串的重疊部分越多越好,可以枚舉a,b,c的全排列,一共六種拼接方法。代碼中,前面可以先特判下完全包含的情況。沒有完全包含的情況下,希望重疊的部分最長。python可以自定義排序規(guī)則:長度不同時,長度最短優(yōu)先;長度相同時,按字典序排序。
統(tǒng)計范圍內(nèi)的步進數(shù)字數(shù)目
【數(shù)位DP】定義calc(n)為不超過n的步進數(shù)字個數(shù),答案是calc(high) - calc(low) + valid(low),用數(shù)位do算calc(n)。定義f(i, pre, isLimit, isNum)為構(gòu)造第i位及其之后數(shù)位的合法方案數(shù),其中,pre表示上一個數(shù)位的值,如果isNum為false,可以忽略pre;isLimit為當(dāng)前是否受到n的約束,若為真,則第i位填入數(shù)字至多為s[i],否則是9。如果在受到約束的情況下填了s[i],后續(xù)填入的數(shù)字仍會受到n的約束,isNum表示i前面的數(shù)位是否填了數(shù)字,若為假,則當(dāng)前位可以跳過(不填數(shù)字),或者要填入的數(shù)字至少是1;若為真,則要填入的數(shù)字可以從0開始,例如n=123,在i=0時跳過,相當(dāng)于后面要構(gòu)造的是一個99以內(nèi)的數(shù)字,如果i=1不跳過,相當(dāng)于構(gòu)造一個10-99的兩位數(shù),如果i=1也跳過,相當(dāng)于構(gòu)造的是一個9以內(nèi)的數(shù)字。