<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          【一天一道Leetcode】笨階乘

          共 2905字,需瀏覽 6分鐘

           ·

          2021-04-11 22:50


          本篇推文共計(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é)果是-12


          3. [加減先入棧]出現(xiàn)加法、減法的時(shí)候,可以把減法視為加上一個(gè)數(shù)的相反數(shù),然后壓入棧中,等待遇見(jiàn)[乘法],[除法]的時(shí)候再取出計(jì)算。

           

          4. [最后累加和]最后將棧中元素累加輸出即為答案。





          我們用5來(lái)舉例這個(gè)過(guò)程:

          clumsy(6) = 6 * 5 / 4 + 3 - 2 * 1


          i=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)Ⅱ



          ☆ END ☆

          你與世界

          只差一個(gè)

          公眾號(hào)

          瀏覽 28
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  色婷婷成人做爱a片免费看网站 | av无码国产电影在线观看 | 99色精品视频 | 激情国产在线观看 | 日韩一级免费在线观看 |