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

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

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

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

我說,那轉(zhuǎn)2進(jìn)制吧,1位擴(kuò)展成5位,累加更方便。結(jié)果長度不被5整除,頭部就補(bǔ)0,也好做。

對方說,也不能轉(zhuǎn)2進(jìn)制。

那你明說嘛,就是想要模擬我們小學(xué)的加號算法,運(yùn)用到32進(jìn)制上,是不?

對,就是這個意思!

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:以兩個String為輸入,以一個String為輸出,String代表32進(jìn)制字符
2:0到9,A到Z,分別代表0~31,String中除此之外的字符不合法
3:add_next_column表示進(jìn)位標(biāo)識符,初始化0
4:輸入字符串 ---> 翻轉(zhuǎn)reverse---> 轉(zhuǎn)數(shù)組Array[Char]
5:若兩個輸入String長度不相等,則短的翻轉(zhuǎn)后補(bǔ)0對齊
6:逐位相加再加進(jìn)位符,若結(jié)果超過32,進(jìn)位標(biāo)識符記1
7:所有位數(shù)對齊相加完畢后,若最后一位(即翻轉(zhuǎn)前的最高位)相加結(jié)果大于32,即進(jìn)位標(biāo)識符又為1,則結(jié)果列表中最后再加一位1
8:結(jié)果列表result_list轉(zhuǎn)換成String,再翻轉(zhuǎn)reverse,即得最終結(jié)果

思路或者代碼中,從時間成本/內(nèi)存成本來考慮,應(yīng)該有可以優(yōu)化之處,幾個reverse操作,開銷感覺也不算小,但是應(yīng)該也不算大。
我不是專門做這類優(yōu)化的,有了解的朋友歡迎指點(diǎn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容