【一天一道Leetcode】笨階乘

本篇推文共計(jì)2000個(gè)字,閱讀時(shí)間約3分鐘。
01
題目描述

題目描述:
正如我們所了解的,正整數(shù) n 的階乘是所有小于或等于 n 的正整數(shù)的乘積。
例如:
factorial(10) = 10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1相反,我們?cè)O(shè)計(jì)了一個(gè)笨階乘clumsy:在整數(shù)的遞減序列中,我們以一個(gè)固定順序的操作符序列來(lái)依次替換原有的乘法操作符:乘法(*),除法(/),加法(+)和減法(-)。
例如:
clumsy(10) = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1然而,這些運(yùn)算仍然使用通常的算術(shù)運(yùn)算順序:我們?cè)谌魏渭?、減步驟之前執(zhí)行所有的乘法和除法步驟,并且按從左到右處理乘法和除法步驟。
另外,我們使用的除法是地板除法(floor division),
所以 10 * 9 / 8 等于 11。這保證結(jié)果是一個(gè)整數(shù)。
實(shí)現(xiàn)上面定義的笨階乘函數(shù):給定一個(gè)整數(shù) N,它返回 N 的笨階乘。
示例:
示例 1:
輸入:4
輸出:7
解釋:7 = 4 * 3 / 2 + 1
示例 2:
輸入:10
輸出:12
解釋:12 = 10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1提示:
1.1 <= N <= 10000
2.-2^31 <= answer <= 2^31 - 1
02
思路和方法
由題意可知,
表達(dá)式中的計(jì)算一般可以借助數(shù)據(jù)結(jié)構(gòu)[棧]完成。
根據(jù)題意,該題沒(méi)有顯式符號(hào),運(yùn)算級(jí)別是先乘除后加減,我們可以從N開(kāi)始,利用枚舉法N-1、N-2直到1。
1. [四次一循環(huán)]這道題中數(shù)字是遞減的,計(jì)算操作是4次一循環(huán)。根據(jù)這個(gè)特性,我們?cè)诰幊讨锌梢岳脤?duì)4進(jìn)行取余來(lái)判斷計(jì)算操作。
2. [乘除立即算]出現(xiàn)乘法、除法的時(shí)候可以把棧頂元素取出,立即與當(dāng)前的N進(jìn)行乘法、除法運(yùn)算,并將運(yùn)算結(jié)果重新壓入棧中。
題目要求進(jìn)行地板除法,
該方法就表示向下取整。
math.floor(11.6)的結(jié)果為11,
math.floor(-11.6)的結(jié)果是-123. [加減先入棧]出現(xiàn)加法、減法的時(shí)候,可以把減法視為加上一個(gè)數(shù)的相反數(shù),然后壓入棧中,等待遇見(jiàn)[乘法],[除法]的時(shí)候再取出計(jì)算。
4. [最后累加和]最后將棧中元素累加輸出即為答案。

我們用5來(lái)舉例這個(gè)過(guò)程:
clumsy(6) = 6 * 5 / 4 + 3 - 2 * 1i=0時(shí),當(dāng)前數(shù)字是6,先把第一個(gè)數(shù)字6壓入棧,

i=1時(shí),當(dāng)前數(shù)字是5,當(dāng)前index=0,index%4=0
棧頂元素是6
立即計(jì)算6*5=30,將結(jié)果放入棧中。

i=2時(shí),當(dāng)前數(shù)字是4,當(dāng)前index=1,index%4=1
棧頂元素是30
立即計(jì)算30/4=7,將結(jié)果放入棧中。

i=3時(shí),當(dāng)前數(shù)字是3,當(dāng)前index=2,index%4=2
棧頂元素是7
將3放入棧中。

i=4時(shí),當(dāng)前數(shù)字是2,當(dāng)前index=3,index%4=3
將-2放入棧中。

i=5時(shí),當(dāng)前數(shù)字是1,當(dāng)前index=4,index%4=0
棧頂元素是-2
立即計(jì)算(-2)*1=-2,將結(jié)果放入棧中。

元素遍歷完,
最后計(jì)算棧中元素即可:7+3+(-2)=8

綜上我們的代碼表示為:
class Solution(object):
def clumsy(self, N):
index = 0
stack = [N]
for i in range(N - 1, 0, -1):
if index == 0:
stack.append(stack.pop() * i)
elif index == 1:
stack.append(int(stack.pop() / float(i)))
elif index == 2:
stack.append(i)
elif index == 3:
stack.append(-i)
index = (index + 1) % 4
return sum(stack)
【年終總結(jié)】你好2021,再見(jiàn)2020。

【秋招紀(jì)實(shí)錄】一篇特別正經(jīng)的【騰訊】求職經(jīng)驗(yàn)分享

【一天一道Leetcode】刪除有序數(shù)組的重復(fù)項(xiàng)Ⅱ
你與世界
只差一個(gè)
公眾號(hào)

