scala-problem01-05

[TOC]

** 聲明**
該系列文章來自:http://aperiodic.net/phil/scala/s-99/
大部分內(nèi)容和原文相同,加入了部分自己的代碼。
如有侵權(quán),請(qǐng)及時(shí)聯(lián)系本人澜建。本人將立即刪除相關(guān)內(nèi)容署恍。

P01 (*) Find the last element of a list.

要求

找出list中的最后一個(gè)元素

方案

  • (1)List自帶的last方法(廢話)
def builtInLast[T](list: List[T]): T =list.last
  • (2)將list反轉(zhuǎn)碧查,之后取其head
def lastByReverse[T](list: List[T]): T = list.reverse.head
  • (3)遞歸
    def lastRecursive[T](list: List[T]): T = list match {
        case e :: Nil  => e
        case _ :: tail => lastRecursive(tail)
        case _         => throw new NoSuchElementException
    }

P02(*) Find the last but one element of a list

要求

找出list中倒數(shù)第二個(gè)元素

Example:

scala> penultimate(List(1, 1, 2, 3, 5, 8))
res0: Int = 5

方案

  • (1) reverse.tail.head
def builtInSolution1[T](list: List[T]): T = {
    if (list.isEmpty || list.size <= 1) throw new NoSuchElementException
    list.reverse.tail.head
}
  • (2) init.last
def builtInSolution2[T](list: List[T]): T = {
    if (list.isEmpty || list.size <= 1) throw new NoSuchElementException
    list.init.last
}
  • (3) 遞歸
def recursiveSolution[T](list: List[T]): T = list match {
    case e :: _ :: Nil => e
    case _ :: tail     => recursiveSolution(tail)
    case _             => throw new NoSuchElementException
}

P03(*) Find the Kth element of a list.

要求

獲取list中第n(從零開始)個(gè)元素

方案

  • (1) list自帶索引(廢話)
def builtInSolution[T](n: Int, list: List[T]): T = {
    if (n < 0) throw new NoSuchElementException
    list(n)
}
  • (2) 遞歸
def recursiveSolution[T](n: Int, list: List[T]): T = (n, list) match {
    case (0, e :: _)    => e
    case (x, _ :: tail) => recursiveSolution(x - 1, tail)
    case (_, Nil)       => throw new NoSuchElementException
}

P04 (*) Find the number of elements of a list.

要求

計(jì)算list的長(zhǎng)度

Example:

scala> length(List(1, 1, 2, 3, 5, 8))
res0: Int = 6

方案

  • (1) list.length(廢話)
def buildInSolution[T](list: List[T]): Int = list.length
  • (2) 普通遞歸
def recursiveSolution[T](list: List[T]): Int = list match {
    case Nil       => 0
    case _ :: tail => 1 + recursiveSolution(tail)
}
  • (3) 尾遞歸
def lengthTailRecursive[T](list: List[T]): Int = {
    def lengthR(x: Int, list: List[T]): Int = list match {
        case Nil       => x
        case _ :: tail => lengthR(x + 1, tail)
    }
    return lengthR(0, list)
}
  • (4) foldLeft
def builtInSolution2[T](list: List[T]): Int =
    list.foldLeft(0)((c, head) => c + 1)
  • (5) 遍歷list(沒啥好說的)

P05 (*) Reverse a list.

要求

逆轉(zhuǎn)一個(gè)list

Example:

scala> reverse(List(1, 1, 2, 3, 5, 8))
res0: List[Int] = List(8, 5, 3, 2, 1, 1)

方案

  • (1) list.reverse(廢話)
def builtInSolution[T](list: List[T]): List[T] = list.reverse
  • (2) 遞歸
def recursiveSolution[T](list: List[T]): List[T] = list match {
    case Nil       => List()
    case h :: tail => recursiveSolution(tail) ::: List(h)
}
  • (3) 尾遞歸
def reverseTailRecursive[T](list: List[T]): List[T] = {
    def recursiveR(ret: List[T], l: List[T]): List[T] = l match {
        case Nil       => ret
        case h :: tail => recursiveR(h :: ret, tail)
    }

    return recursiveR(Nil, list)
}
  • (4) foldLeft
def reverseFunctional[A](ls: List[A]): List[A] =
    ls.foldLeft(List[A]()) { (ret, head) => head :: ret }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末约啊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子另玖,更是在濱河造成了極大的恐慌困曙,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件谦去,死亡現(xiàn)場(chǎng)離奇詭異慷丽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)鳄哭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門要糊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人妆丘,你說我怎么就攤上這事锄俄【志ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵珊膜,是天一觀的道長(zhǎng)容握。 經(jīng)常有香客問我宣脉,道長(zhǎng)车柠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任塑猖,我火速辦了婚禮竹祷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羊苟。我一直安慰自己塑陵,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布蜡励。 她就那樣靜靜地躺著令花,像睡著了一般。 火紅的嫁衣襯著肌膚如雪凉倚。 梳的紋絲不亂的頭發(fā)上兼都,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音稽寒,去河邊找鬼扮碧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛杏糙,可吹牛的內(nèi)容都是我干的慎王。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼宏侍,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼赖淤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谅河,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤咱旱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后旧蛾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莽龟,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年锨天,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了毯盈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡病袄,死狀恐怖搂赋,靈堂內(nèi)的尸體忽然破棺而出赘阀,到底是詐尸還是另有隱情,我是刑警寧澤脑奠,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布基公,位于F島的核電站,受9級(jí)特大地震影響宋欺,放射性物質(zhì)發(fā)生泄漏轰豆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一齿诞、第九天 我趴在偏房一處隱蔽的房頂上張望酸休。 院中可真熱鬧,春花似錦祷杈、人聲如沸斑司。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽宿刮。三九已至,卻和暖如春私蕾,著一層夾襖步出監(jiān)牢的瞬間僵缺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工是目, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谤饭,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓懊纳,卻偏偏與公主長(zhǎng)得像揉抵,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗤疯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

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