转化字符串
模拟,数字拼接的思路模糊,字符串拼接的思路清晰,于是有:数字转字符串,字符串拼接,字符串转数字(得到两个数字的串联)。
cpp
class Solution {
public:
long long findTheArrayConcVal(vector<int>& nums) {
int i = 0, j = nums.size() - 1;
long long ans = 0;
while (i < j) {
ans += stoi(to_string(nums[i ++]) + to_string(nums[j --]));
}
if (i == j) ans += nums[i];
return ans;
}
};
时间复杂度 O ( n l o g U ) O(nlogU) O(nlogU) : n n n是 n u m s nums nums的长度, U U U 是数组元素的最大值,遍历到每个数组元素一次,每个数组元素转换字符串,总体时间复杂度 O ( n l o g U ) O(nlogU) O(nlogU)。
空间复杂度 O ( l o g U ) O(logU) O(logU) : 字符串的空间复杂度 O ( l o g U ) O(logU) O(logU)。
数学+双指针
按照数学方法,直接串联两个数字:前者pre,后者back。算法流程:pre左移(10进制,左移定义为乘以10)back的位数;pre左移的结果+back原先的数值=pre和back的串联。
请看代码:
cpp
class Solution {
public:
long long findTheArrayConcVal(vector<int>& nums) {
int i = 0, j = nums.size() - 1;
long long ans = 0;
int pre, back;
while (i < j) {
pre = nums[i ++], back = nums[j --];
while (back) {
pre *= 10;
back /= 10;
}
ans += pre + nums[j + 1];
}
if (i == j) ans += nums[i];
return ans;
}
};
时间复杂度 O ( n l o g U ) O(nlogU) O(nlogU) : n n n是 n u m s nums nums的长度, U U U 是数组元素的最大值,遍历到每个数组元素一次,每个数组元素转换字符串,总体时间复杂度 O ( n l o g U ) O(nlogU) O(nlogU)。
空间复杂度 O ( 1 ) O(1) O(1) : 只使用常数级空间 O ( 1 ) O(1) O(1)。
AC
致语
- 理解思路很重要。
- 请读者放心留言,可以是疑惑的点,或者感谢/夸奖也可以!!墨染看到会回复的。