2562-找出数组的串联值

Raphael Liu Lv10

给你一个下标从 0 开始的整数数组 nums

现定义两个数字的 串联 是由这两个数值串联起来形成的新数字。

  • 例如,1549 的串联是 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 。

示例 2:

**输入:** nums = [5,14,13,8,12]
**输出:** 673
**解释:** 在执行任一步操作前,nums 为 [5,14,13,8,12] ,串联值为 0 。 
- 在第一步操作中: 
我们选中第一个元素 5 和最后一个元素 12 。 
二者的串联是 512 ,将其加到串联值上,所以串联值等于 512 。 
接着我们从 nums 中移除这两个元素,所以 nums 变为 [14,13,8] 。
- 在第二步操作中:
我们选中第一个元素 14 和最后一个元素 8 。
二者的串联是 148 ,将其加到串联值上,所以串联值等于 660 。
接着我们从 nums 中移除这两个元素,所以 nums 变为 [13] 。 
- 在第三步操作中:
nums 只有一个元素,所以我们选中 13 并将其加到串联值上,所以串联值等于 673 。
接着我们从 nums 中移除这个元素,所以 nums 变为空。 
由于串联值等于 673 ,所以答案就是 673 。

提示:

  • 1 <= nums.length <= 1000
  • 1 <= nums[i] <= 104

方法一:直接模拟

思路与算法

根据题意可知,遍历数组中每次将首尾的元素转化为两个字符串连接后再转换为整数即可,如果字符中只有一个元素则此时直接加上该元素的值。假设数组中含有 n 个元素,则可以分为以下两种情况:

  • n 为偶数时,则可以知道 (\textit{nums}0,\textit{nums}{n-1}),(\textit{nums}1, \textit{nums}{n-2}), \cdots, (\textit{nums}{n}{2}-1},\textit{nums}{n}{2} }) 分别进行连接,统计以上连接后的值即可;
  • n 为奇数时,则可以知道 (\textit{nums}0,\textit{nums}{n-1}),(\textit{nums}1, \textit{nums}{n-2}), \cdots, (\textit{nums}{n-3/2} },\textit{nums}{n+1/2} }) 分别进行连接,nums}_{n-1/2} 作为一个单独的元素统计相加;

根据以上分析,按照上述方法直接模拟相加即可。

代码

[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
long long findTheArrayConcVal(vector<int>& nums) {
long long ans = 0;
for (int i = 0, j = nums.size() - 1; i <= j; i++, j--) {
if (i != j) {
ans += stoi(to_string(nums[i]) + to_string(nums[j]));
} else {
ans += nums[i];
}
}
return ans;
}
};
[sol1-C]
1
2
3
4
5
6
7
8
9
10
11
12
13
long long findTheArrayConcVal(int* nums, int numsSize) {
long long ans = 0;
char str[16];
for (int i = 0, j = numsSize - 1; i <= j; i++, j--) {
if (i != j) {
sprintf(str, "%d%d", nums[i], nums[j]);
ans += atoi(str);
} else {
ans += nums[i];
}
}
return ans;
}
[sol1-Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public long findTheArrayConcVal(int[] nums) {
long ans = 0;
for (int i = 0, j = nums.length - 1; i <= j; i++, j--) {
if (i != j) {
ans += Integer.parseInt(Integer.toString(nums[i]) + Integer.toString(nums[j]));
} else {
ans += nums[i];
}
}
return ans;
}
}
[sol1-C#]
1
2
3
4
5
6
7
8
9
10
11
12
13
public class Solution {
public long FindTheArrayConcVal(int[] nums) {
long ans = 0;
for (int i = 0, j = nums.Length - 1; i <= j; i++, j--) {
if (i != j) {
ans += int.Parse(nums[i].ToString() + nums[j].ToString());
} else {
ans += nums[i];
}
}
return ans;
}
}
[sol1-Python3]
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def findTheArrayConcVal(self, nums: List[int]) -> int:
ans = 0
i, j = 0, len(nums) - 1
while i <= j:
if i != j:
ans += int(str(nums[i]) + str(nums[j]))
else:
ans += nums[i]
i += 1
j -= 1
return ans
[sol1-Go]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
func findTheArrayConcVal(nums []int) int64 {
ans := 0
i, j := 0, len(nums) - 1
for i <= j {
if i != j {
val, _ := strconv.Atoi(strconv.Itoa(nums[i]) + strconv.Itoa(nums[j]))
ans += val
} else {
ans += nums[i]
}
i++
j--
}
return int64(ans)
}
[sol1-JavaScript]
1
2
3
4
5
6
7
8
9
10
11
var findTheArrayConcVal = function(nums) {
let ans = 0;
for (let i = 0, j = nums.length - 1; i <= j; i++, j--) {
if (i < j) {
ans += parseInt(nums[i].toString() + nums[j].toString());
} else {
ans += nums[i];
}
}
return ans
};

复杂度分析

  • 时间复杂度:O(n \log U),其中 n 表示数组的长度,U 表示数组中的元素的最大值。遍历数组时需要将数组中每个元素转换为字符串,需要的时间为 O(\log U),数组中一共有 n 个元素,因此时间复杂度为 O(n \log U)。

  • 空间复杂度:O(log U),U 表示数组中的元素的最大值。遍历数组时需要将数组中每个元素转换为字符串,需要的空间为 O(\log U)。

 Comments
On this page
2562-找出数组的串联值