当前位置: 移动技术网 > 移动技术>移动开发>IOS > 记录腾讯的一面算法题

记录腾讯的一面算法题

2020年07月15日  | 移动技术网移动技术  | 我要评论

腾讯的一面算法题:
记录下
题目:给定两个超大的数字,超过了int的范围,用字符串表示,请把他们相加后用字符串返回。
一:分析
题目给我们两个字符串表示的数字,超过了Integer的范围,所以我们不能单纯的用Integer去相加了。
我们可以把字符串拆开,从个位开始去相加,有进位的就往前进一位相加。用StringBuilder去添加每次相加的数。最后再返回StringBuilder的反转。

二:代码实现
在面试的时候呢,不仅仅只能考虑实现算法,面试官可能还会看你对边界情况的考虑,和代码的可阅读性等。在写的时候可以先说思路,边写边和面试官交流,写一手清晰的代码也会让面试官心动呢,

private fun addBigInteger(strOne: String?, strTwo: String?): String? {
    val builder = StringBuilder()
    //边界情况
    if (strOne.isNullOrEmpty()) {
        return strTwo
    }
    if (strTwo.isNullOrEmpty()) {
        return strOne
    }
    //第一个比第二个小的情况 调换
    if (strOne.length < strTwo.length) {
        return addBigInteger(strTwo, strOne)
    }
    val oneChars = strOne.toCharArray()
    val twoChars = strTwo.toCharArray()
    val step = oneChars.size - twoChars.size
    var prefix = 0
    for (index in (oneChars.size - 1).downTo(0)) {
        val charOne = oneChars[index]
        var charTwo = '0'
        if (index - step >= 0) {
            charTwo = twoChars[index - step]
        }
        val sum = charOne.toString().toInt() + charTwo.toString().toInt() + prefix
        //进位记录
        prefix = sum / 10
        //添加个位
        builder.append(sum % 10)
    }
    if (prefix > 0){
        builder.append(prefix)
    }
    return builder.reverse().toString()
}

三:测试用例

fun main() {
    println(addBigInteger("66","66"))
}

进位的情况,如 66 + 66
第一个比第二个的位数小的情况 如 66+1234
第一个比第二个的位数多的情况 如 1234+66

本文地址:https://blog.csdn.net/lyjSmile/article/details/107334164

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网