这是第20篇算法,力扣链接
给你一个下标从 0 开始的整数数组
nums
。现定义两个数字的 串联 是由这两个数值串联起来形成的新数字。
- 例如,
15
和49
的串联是1549
。
nums
的 串联值 最初等于0
。执行下述操作直到nums
变为空:
- 如果
nums
中存在不止一个数字,分别选中nums
中的第一个元素和最后一个元素,将二者串联得到的值加到nums
的 串联值 上,然后从nums
中删除第一个和最后一个元素。- 如果仅存在一个元素,则将该元素的值加到
nums
的串联值上,然后删除这个元素。返回执行完所有操作后
nums
的串联值。示例 1:
输入:nums = [7,52,2,4] 输出:596 解释:在执行任一步操作前,nums 为 [7,52,2,4] ,串联值为 0 。 - 在第一步操作中: 我们选中第一个元素 7 和最后一个元素 4 。 二者的串联是 74 ,将其加到串联值上,所以串联值等于 74 。 接着我们从 nums 中移除这两个元素,所以 nums 变为 [52,2] 。 - 在第二步操作中: 我们选中第一个元素 52 和最后一个元素 2 。 二者的串联是 522 ,将其加到串联值上,所以串联值等于 596 。 接着我们从 nums 中移除这两个元素,所以 nums 变为空。 由于串联值等于 596 ,所以答案就是 596 。
翻译一下题意,把头尾拼接然后移除做到数组为空位置,然后将每一次的结果进行相加。
这是一道标准的模拟算法,值得注意的是数组里的数字的位数是不一定的,所以不能用简单的加零相加的操作,用字符串拼接是最好的方案。这里我采用了双指针思路。
代码如下:
import (
"strconv"
)
func findTheArrayConcVal(nums []int) int64 {
result := int64(0)
leftIndex, rightIndex := 0, len(nums)-1
for leftIndex <= rightIndex {
if leftIndex == rightIndex {
return result + int64(nums[leftIndex])
}
newNum := strconv.Itoa(nums[leftIndex]) + strconv.Itoa(nums[rightIndex])
parsedInt, _ := strconv.ParseInt(newNum, 10, 64)
result += parsedInt
leftIndex++
rightIndex--
}
return result
}