程式設計師面試金典 17 9

2021-10-08 06:24:35 字數 1205 閱讀 6337

kth multiple:求第k個只包含35或者7這三個素因子的數。

根據輸入k,結果肯定小於3 ^ k * 5 ^ k * 7 ^ k,所以可以把k ^ 3個數都求出來,然後返回下標為k - 1的元素。但是這方法顯然不行啊,乘著乘著就溢位了。

另一種方法就是每次將已獲得的最小元素分別乘這三個質數,然後加入到備選集中,每次從備選集中取出最小的加入結果集,備選集可以使用集合或者優先佇列。使用集合不需要手動判重,優先佇列需要手動去重。

class

solution

return vec[k -1]

;}};

使用優先佇列時需要手動判重,而且預設為大根堆,需要傳入greater轉換為小根堆。

class

solution

}return vec[k -1]

;}};

上面兩種方法要麼是借用資料結構來判重,要麼是手動判重,如果可以省略判重的步驟就好了。通過觀察上面過程可以發現,每當取出乙個新元素時,分別需要乘357來生成新的元素,在這個過程中會得到重複的元素。通過觀察可以發現,如果乙個元素x是乘5得到的,當將這個元素乘3後,肯定和備選集中的乙個元素是重複的,因為當對這個元素分解質因數時,最後乙個質因數肯定是5,而y = x * 3 / 5肯定是小於x的,這就意味著當將y加入結果集時,通過乘5已經將新元素加入了備選集,根據這個性質,只需要將元素x57的結果加入備選集就可以了。

class

solution

else

if(minele == five.

front()

)else

}return vec[k -1]

;}};

因為整型數的範圍存在上限,也可以把表打出來然後直接返回即可。

程式設計師面試金典

1.有個小孩正在上樓梯,樓梯有n階台階,小孩一次可以上1階 2階 3階。請實現乙個方法,計算小孩有多少種上樓的方式。為了防止溢位,請將結果mod 1000000007 給定乙個正整數intn,請返回乙個數,代表上樓的方式數。保證n小於等於100000。int countways int n retu...

程式設計師面試金典 2 2

return kth to last 返回單鏈表中倒數第k個元素。下面會分別使用遞迴和非遞迴的方法來解決這道題,一般來說遞迴的方法寫起來更容易,但是效率一般不是最好的,比如這道題遞迴解法的 量大約是非遞迴解法的一半,但是時間複雜度依然是o n 遞迴解法。這種方法的本質是先遍歷到鍊錶尾部,最後再返回的...

程式設計師面試金典 2 4

partition 編寫 將鍊錶中小於x的元素放在鍊錶的前半部分,大於x的元素放在鍊錶的後半部分,沒有順序要求。如果是陣列的話,根據x對陣列進行劃分的方法類似於快排。對於鍊錶會更簡單一些,可以直接將原始鍊錶拆分為兩個鍊錶,乙個中所有元素比x小,乙個中所有元素比x大,最後再進行連線。通過在鍊錶中使用b...