【每日一題】LeetCode. 面試題64. 求1+2+...+n

每日一題,防止癡呆 = =

一、題目大意

求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。
在這裏插入圖片描述
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/qiu-12n-lcof

二、題目思路以及AC代碼

這種題我還是第一次見,其實求得1+2+…+n有很多種方法,但是題目限制不能使用乘除法還有一些關鍵字,就得琢磨琢磨了。

思路一:冪運算 + 加法

這個是我最開始想到的,雖然不知道行不行。我們都知道高斯定理求解這個問題的公式是n*(n+1)/2,那麼我們把上面展開,就是 n2+n,而題目中只提到了不能用乘除法,這個也算是避開了吧,雖然可能在pow函數的實現上使用了乘法。然後除以2就直接用移位運算符代替就好了。

思路二:遞歸

當然除了上面的不知道對不對的思路,我們還可以用邏輯運算符的短路原則去建立遞歸。若A&&B,且A爲false,則後面就不再被運算了,同理若A||B,且A爲true,後面也不會再被運算,所以我們就可以以前一部分A作爲遞歸結束的條件,然後B作爲遞歸的體。

思路三:俄羅斯農民乘法

這個其實我之前也不知道,原理的話可以看一下這個博客 俄羅斯農民乘法

這個方法總之就是可以用二進制來通過加法計算乘法。這樣的話,由於題目限制給定n的大小小於10000,而10000的二進制數長度是14位,雖然是需要用到循環,但我們可以把循環展開成14個順序語句,就可以了。

但是這裏我想吐槽一下,既然可以這樣循環展開,那我完全可以展開10000個循環體,每個循環體就是 n >= i && res += i,不是也可以? 雖然這樣是比俄羅斯農民乘法複雜 = =。

AC代碼

這裏就給出思路二的吧,思路一是比較簡單,思路三是後來沒有寫 = =。

class Solution {
public:
    int sumNums(int n) {
        !n || (n += sumNums(n-1));
        return n;
    }
};

如果有問題,歡迎大家指正!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章