刷算法 - 算法練習(xí)

最近斷斷續(xù)續(xù)的刷了一些基礎(chǔ)算法題. 我們做移動端開發(fā)的, 刷算法題有意義嗎? 如果對這個問題有疑問, 可以在讀這篇文章之前先讀下巧神的文章: 搞 iOS 的學(xué)算法有意義嗎获三?

下面這篇文章, 主要是用 OC 語言練習(xí)的幾個小算法, 會不定期更新. 首先放兩個不錯的鏈接地址: 劍指offer 算法題, Leetcode 題解, 有興趣的童鞋可以一起學(xué)習(xí)哈!

1. 1-n 階乘之和

1-n階乘之和怎么算屹篓?

  • 1的階乘是1
  • 2的階乘是1*2
  • 3的階乘是123
  • 4的階乘是123*4
  • .........

現(xiàn)在我們要求這些階乘的和鸠项。思路:

  • 3階乘的和其實上就是2階乘的和+3的階乘
  • 4階乘的和其實上就是3階乘的和+4的階乘
  • .......
/** 1-n 階乘之和 */
- (NSInteger)factorialWithNumber:(NSInteger)number {
    // 總和
    NSInteger sum = 0;
    // 階乘值, 初始化為1
    NSInteger factorial = 1;
    for (NSInteger i = 1; i <= number; i++) {
        factorial = factorial * i;
        sum = (int) (sum + factorial);
    }
    return sum;
}

2. 跳臺階問題

一只青蛙一次可以跳上 1 級臺階做粤,也可以跳上 2 級贴唇。求該青蛙跳上一個 n 級的臺階總共有多少種跳法絮记。

我們假設(shè)到第 n 階總共有 f(n) 種跳法肝集,而且想跳到第 n 階只有兩種可能瞪讼,要么從第 n-1 階跳一階到達岭参,要么從第 n-2 階跳兩階到達,所以遞推式為f(n) = f(n-1) + f(n-2)尝艘。特殊情況為演侯,n=0 的時候跳法為 0;n=1時背亥,跳法為1秒际;n=2時,跳法為2;

/** 跳臺階問題 */
- (NSInteger)jumpFloor:(NSInteger)number {
    if(number < 1)
        return 0;
    if(number == 1)
        return 1;
    if(number == 2)
        return 2;
    return [self jumpFloor:(number-1)] + [self jumpFloor:(number-2)];
}

3. 變態(tài)跳臺階問題

一只青蛙一次可以跳上 1 級臺階狡汉,也可以跳上 2 級……它也可以跳上 n 級娄徊。求該青蛙跳上一個n級的臺階總共有多少種跳法。

  • 先看 n = 0 時盾戴,跳法 f(0) = 0寄锐;
  • n = 1,只能是從第 0 個臺階跳過來,跳法 f(1) = 1;
  • n = 2橄仆,可能是第 0 個臺階跳了 2 階或者從第 1 個臺階跳了 1 階剩膘,跳法f(2) = 2 * f(1) = 2;
  • n = 3,可能是第 0 個臺階跳了 3 階盆顾、第 1 個臺階跳了 2 階怠褐、第 2 個臺階跳了 1 階、各跳 1 階您宪,跳法 f(3) = 2 * f(2) = 4;
  • ...
  • n = n-1奈懒,跳法 f(n-1) = 2f(n-2);
  • n = n,跳法 2f(n-1);
  • 由上面兩個等式得:f(n) = 2f(n-1)
/** 變態(tài)跳臺階問題 */
- (NSInteger)jumpFloorII:(NSInteger)number {
    if(number < 1)
        return 0;
    if(number == 1)
        return 1;
    return 2*[self jumpFloorII:(number-1)];
}

4. 求1+2+3+...+n

求1+2+3+...+n宪巨,要求不能使用乘除法磷杏、for、while捏卓、if茴丰、else、switch天吓、case等關(guān)鍵字及條件判斷語句(A?B:C)

題目要求不能使用乘除法贿肩、for、while龄寞、if汰规、else、switch物邑、case 等關(guān)鍵字及條件判斷語句溜哮,那么首先就要思考怎么才能使 n 一次次的相加且到 0 的時候結(jié)束。首先遞歸可以實現(xiàn)每次 n-1 的相加色解,即類似于 n + f(n-1) 這樣的茂嗓。但是這樣做的話遞歸的出口在哪呢,也就是我們不能使用條件語句來控制遞歸何時停止科阎。
仔細想想還有什么運算符可以達到條件控制的效果述吸,這個時候 && 運算符就出現(xiàn)了

/** 求1+2+3+...+n */
- (NSInteger)sum_Solution:(NSInteger)number {
    number && (number += [self sum_Solution:(number-1)]);
    return number;
}

5. 不用加減乘除做加法

寫一個函數(shù),求兩個整數(shù)之和锣笨,要求在函數(shù)體內(nèi)不得使用 +蝌矛、-、*错英、/ 四則運算符號入撒。

a ^ b 表示沒有考慮進位的情況下兩數(shù)的和,(a & b) << 1 就是進位椭岩。

遞歸會終止的原因是 (a & b) << 1 最右邊會多一個 0茅逮,那么繼續(xù)遞歸璃赡,進位最右邊的 0 會慢慢增多,最后進位會變?yōu)?0献雅,遞歸終止碉考。

/** 不用加減乘除做加法 */
- (NSInteger)sumA:(NSInteger)a b:(NSInteger)b {
    return b == 0 ? a : [self sumA:(a ^ b) b:((a & b) << 1)];
}

6. 圓圈中最后剩下的數(shù)

讓小朋友們圍成一個大圈。然后惩琉,他隨機指定一個數(shù) m,讓編號為 0 的小朋友開始報數(shù)夺荒。每次喊到 m-1 的那個小朋友要出列唱首歌瞒渠,然后可以在禮品箱中任意的挑選禮物,并且不再回到圈中技扼,從他的下一個小朋友開始伍玖,繼續(xù) 0...m-1 報數(shù) .... 這樣下去 .... 直到剩下最后一個小朋友,可以不用表演剿吻。

約瑟夫環(huán)窍箍,圓圈長度為 n 的解可以看成長度為 n-1 的解再加上報數(shù)的長度 m。因為是圓圈丽旅,所以最后需要對 n 取余椰棘。

/** 圓圈中最后剩下的數(shù) */
- (NSInteger)lastRemaining_Solution:(NSInteger)n m:(NSInteger)m {
    // 特殊輸入的處理
    if (n == 0)
        return -1;
    if (n == 1)
        return 0;
    return ([self lastRemaining_Solution:n-1 m:m] + m) % n;
}

7. 從 1 到 n 整數(shù)中 1 出現(xiàn)的次數(shù)

/** 從 1 到 n 整數(shù)中 1 出現(xiàn)的次數(shù) */
- (NSInteger)numberOf1Between1AndN:(NSInteger)n {
    NSInteger number = 0;
    for (NSInteger m = 1; m <= n; m *= 10) {
        NSInteger a = n / m, b = n % m;
        number += (a + 8) / 10 * m + (a % 10 == 1 ? b + 1 : 0);
    }
    return number;
}

代碼在這里, 算法練習(xí): NNAlgorithm, 有興趣的童鞋可以下載下 demo, 看下打印效果.

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市榄笙,隨后出現(xiàn)的幾起案子邪狞,更是在濱河造成了極大的恐慌,老刑警劉巖茅撞,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件帆卓,死亡現(xiàn)場離奇詭異,居然都是意外死亡米丘,警方通過查閱死者的電腦和手機剑令,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來拄查,“玉大人吁津,你說我怎么就攤上這事《榉觯” “怎么了腺毫?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長挣柬。 經(jīng)常有香客問我潮酒,道長,這世上最難降的妖魔是什么邪蛔? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任急黎,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勃教。我一直安慰自己淤击,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布故源。 她就那樣靜靜地躺著污抬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绳军。 梳的紋絲不亂的頭發(fā)上印机,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音门驾,去河邊找鬼射赛。 笑死,一個胖子當著我的面吹牛奶是,可吹牛的內(nèi)容都是我干的楣责。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼聂沙,長吁一口氣:“原來是場噩夢啊……” “哼秆麸!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起及汉,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤蛔屹,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后豁生,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體兔毒,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年甸箱,在試婚紗的時候發(fā)現(xiàn)自己被綠了育叁。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡芍殖,死狀恐怖豪嗽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情豌骏,我是刑警寧澤龟梦,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站窃躲,受9級特大地震影響计贰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蒂窒,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一躁倒、第九天 我趴在偏房一處隱蔽的房頂上張望荞怒。 院中可真熱鬧,春花似錦秧秉、人聲如沸褐桌。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽荧嵌。三九已至,卻和暖如春砾淌,著一層夾襖步出監(jiān)牢的瞬間啦撮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工拇舀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逻族,地道東北人蜻底。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓骄崩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親薄辅。 傳聞我的和親對象是個殘疾皇子要拂,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容