美文网首页
Scala进阶笔记---32位加法实现

Scala进阶笔记---32位加法实现

作者: Nicky_Ye | 来源:发表于2018-02-08 14:38 被阅读0次

昨晚一位朋友去面试某一知名互联网公司,对方出了一道题,问如何实现32位加法?

我第一时间反应,将两个加数分别转换成十进制,再调用十进制的“+” 进行操作,结果再转换回32进制即可。

朋友告诉我,对方不许转10进制。

我说,那转2进制吧,1位扩展成5位,累加更方便。结果长度不被5整除,头部就补0,也好做。

对方说,也不能转2进制。

那你明说嘛,就是想要模拟我们小学的加号算法,运用到32进制上,是不?

对,就是这个意思!

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进位标志符
      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进制字符
2:0到9,A到Z,分别代表0~31,String中除此之外的字符不合法
3:add_next_column表示进位标识符,初始化0
4:输入字符串 ---> 翻转reverse---> 转数组Array[Char]
5:若两个输入String长度不相等,则短的翻转后补0对齐
6:逐位相加再加进位符,若结果超过32,进位标识符记1
7:所有位数对齐相加完毕后,若最后一位(即翻转前的最高位)相加结果大于32,即进位标识符又为1,则结果列表中最后再加一位1
8:结果列表result_list转换成String,再翻转reverse,即得最终结果

思路或者代码中,从时间成本/内存成本来考虑,应该有可以优化之处,几个reverse操作,开销感觉也不算小,但是应该也不算大。
我不是专门做这类优化的,有了解的朋友欢迎指点。

相关文章

  • Scala进阶笔记---32位加法实现

    昨晚一位朋友去面试某一知名互联网公司,对方出了一道题,问如何实现32位加法? 我第一时间反应,将两个加数分别转换成...

  • 机试常用算法和题型-大数专题

    大数专题 字符加减关系,实现任意长度整数相加 大数加法,进阶转换版 大数浮点数加法 大数运算之阶乘

  • 从零开始学习Spark(五)Scala进阶

    Scala进阶 在后面的文章中,会涉及到一些Scala中我们还没有接触到的语法。这篇Scala进阶会在Scala基...

  • Scala相关文章索引(2)

    基本常识 scala编程第17章学习笔记(1)——集合类型 scala Map类型笔记 scala代码风格指南--...

  • Scala集合

    附上Effective Scala:Effective Scala学习笔记摘抄于Twitter scala文档:T...

  • 《Scala 程序设计》学习笔记 说明

    本笔记是我在学习完 Scala 语法后,重学 Scala 时记录的。笔记中的内容侧重 Scala 和 函数式语言的...

  • Scala学习笔记(八) 模式匹配

    1. 模式匹配简介 模式匹配是 Scala 的重要特性之一,前面两篇笔记Scala学习笔记(六) Scala的偏函...

  • Scala学习笔记

    Scala笔记 基础教程 http://www.runoob.com/scala/currying-functio...

  • Scala基础

    学习笔记摘抄于Twitter scala文档:Twitter.github.ionext:Scala类&对象(一)...

  • Scala笔记

    Scala基础 学习twitter的scala教程的笔记 函数 函数定义,scala语法中可以使用多种方式定义函数...

网友评论

      本文标题:Scala进阶笔记---32位加法实现

      本文链接:https://www.haomeiwen.com/subject/tmdttftx.html