Scala進(jìn)階筆記---32位加法實(shí)現(xiàn)

昨晚一位朋友去面試某一知名互聯(lián)網(wǎng)公司立由,對(duì)方出了一道題后裸,問(wèn)如何實(shí)現(xiàn)32位加法?

我第一時(shí)間反應(yīng)殖蚕,將兩個(gè)加數(shù)分別轉(zhuǎn)換成十進(jìn)制轿衔,再調(diào)用十進(jìn)制的“+” 進(jìn)行操作,結(jié)果再轉(zhuǎn)換回32進(jìn)制即可睦疫。

朋友告訴我害驹,對(duì)方不許轉(zhuǎn)10進(jìn)制。

我說(shuō)蛤育,那轉(zhuǎn)2進(jìn)制吧宛官,1位擴(kuò)展成5位,累加更方便瓦糕。結(jié)果長(zhǎng)度不被5整除底洗,頭部就補(bǔ)0,也好做咕娄。

對(duì)方說(shuō)亥揖,也不能轉(zhuǎn)2進(jìn)制。

那你明說(shuō)嘛圣勒,就是想要模擬我們小學(xué)的加號(hào)算法徐块,運(yùn)用到32進(jìn)制上,是不灾而?

對(duì),就是這個(gè)意思扳剿!

OK旁趟,talk is cheap, show me the code:

import java.io.IOException

import scala.collection.mutable

/**
  * Created by nicky_ye on 2018/2/8.
  */
object hex_32_add {
  val char_list = List('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
    'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'R', 'S', 'T', 'U', 'W', 'X', 'Y', 'Z')
  val char_list_map: mutable.Map[Char, Int] = mutable.Map()
  for (i <- char_list) {
    char_list_map += (i -> char_list.indexOf(i))
  }

  def hex_32_add(string1: String, string2: String): String = {
    if (!string1.forall(x => char_list.contains(x)) || !string2.forall(y => char_list.contains(y))) {
      throw new IOException("Wrong Input String")  ////pre check of input strings' legality
    }
    else {
      var string1_reverse: Array[Char] = string1.reverse.toArray
      var string2_reverse: Array[Char] = string2.reverse.toArray
      var result_list: Array[Char] = Array()
      var add_next_column = 0 //sign進(jìn)位標(biāo)志符
      for (i <- 0 until math.max(string1_reverse.length, string2_reverse.length)) {
        if (i >= string1_reverse.length) string1_reverse = string1_reverse.:+('0')
        if (i >= string2_reverse.length) string2_reverse = string2_reverse.:+('0')

        var column_result = char_list_map(string1_reverse(i)) + char_list_map(string2_reverse(i)) + add_next_column
        if (column_result > 31) {
          add_next_column = 1
          column_result -= 32
        }
        else {
          add_next_column = 0
        }
        result_list = result_list.:+(char_list(column_result))
      }
      if (add_next_column == 1) result_list = result_list.:+('1')
      result_list.toList.toString.replace("List(","").replace(", ","").replace(")","").reverse
    }
  }
}

基本思想:
1:以?xún)蓚€(gè)String為輸入,以一個(gè)String為輸出,String代表32進(jìn)制字符
2:0到9锡搜,A到Z橙困,分別代表0~31,String中除此之外的字符不合法
3:add_next_column表示進(jìn)位標(biāo)識(shí)符耕餐,初始化0
4:輸入字符串 ---> 翻轉(zhuǎn)reverse---> 轉(zhuǎn)數(shù)組Array[Char]
5:若兩個(gè)輸入String長(zhǎng)度不相等凡傅,則短的翻轉(zhuǎn)后補(bǔ)0對(duì)齊
6:逐位相加再加進(jìn)位符,若結(jié)果超過(guò)32肠缔,進(jìn)位標(biāo)識(shí)符記1
7:所有位數(shù)對(duì)齊相加完畢后夏跷,若最后一位(即翻轉(zhuǎn)前的最高位)相加結(jié)果大于32,即進(jìn)位標(biāo)識(shí)符又為1明未,則結(jié)果列表中最后再加一位1
8:結(jié)果列表result_list轉(zhuǎn)換成String槽华,再翻轉(zhuǎn)reverse,即得最終結(jié)果

思路或者代碼中趟妥,從時(shí)間成本/內(nèi)存成本來(lái)考慮猫态,應(yīng)該有可以?xún)?yōu)化之處,幾個(gè)reverse操作披摄,開(kāi)銷(xiāo)感覺(jué)也不算小亲雪,但是應(yīng)該也不算大。
我不是專(zhuān)門(mén)做這類(lèi)優(yōu)化的疚膊,有了解的朋友歡迎指點(diǎn)义辕。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市酿联,隨后出現(xiàn)的幾起案子终息,更是在濱河造成了極大的恐慌,老刑警劉巖贞让,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件周崭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡喳张,警方通過(guò)查閱死者的電腦和手機(jī)续镇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)销部,“玉大人摸航,你說(shuō)我怎么就攤上這事【俗” “怎么了酱虎?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)擂涛。 經(jīng)常有香客問(wèn)我读串,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任恢暖,我火速辦了婚禮排监,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘杰捂。我一直安慰自己舆床,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布嫁佳。 她就那樣靜靜地躺著挨队,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脱拼。 梳的紋絲不亂的頭發(fā)上瞒瘸,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音熄浓,去河邊找鬼情臭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛赌蔑,可吹牛的內(nèi)容都是我干的俯在。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼娃惯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼跷乐!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起趾浅,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤愕提,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后皿哨,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體浅侨,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年证膨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了如输。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡央勒,死狀恐怖不见,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情崔步,我是刑警寧澤稳吮,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站井濒,受9級(jí)特大地震影響灶似,放射性物質(zhì)發(fā)生泄漏慎陵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一喻奥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捏悬,春花似錦撞蚕、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至寇钉,卻和暖如春刀疙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扫倡。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工谦秧, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人撵溃。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓疚鲤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親缘挑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子集歇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355