LeetCode 2562. 找出数组的串联值【数组,相向双指针】1259

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

LeetCode 2562. 找出数组的串联值【数组,相向双指针】1259_第1张图片
给你一个下标从 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

示例 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] <= 10^4

解法 相向双指针

使用了库函数 to_string 的情况如下,注意最后只剩一个元素的情况。

class Solution {
public:
    long long findTheArrayConcVal(vector<int>& nums) {
        int n = nums.size();
        long long ans = 0;
        for (int i = 0, j = n - 1; i < j; ++i, --j) {
            ans += (long long) stoll(to_string(nums[i]) + to_string(nums[j]));
        }
        if (n & 1) ans += (long long) nums[n / 2];
        return ans;
    }
};

如果不使用库函数,我们可以得到一个 O ( 1 ) O(1) O(1) 空间的写法。由于每次操作都是取出 n u m s nums nums 的第一个元素和最后一个元素串联,所以相向双指针模拟即可。例如 x = 15 , y = 49 x=15,y = 49 x=15,y=49 串联,结果等于 x ⋅ 1 0 2 + y = 1549 x\cdot {10^2} + y=1549 x102+y=1549 。我们可以把 y y y 不断除 10 10 10 ,来知道 x x x 要乘上 10 10 10 的多少次方。

class Solution {
public:
    long long findTheArrayConcVal(vector<int>& nums) {
        int n = nums.size();
        long long ans = 0;
        for (int i = 0, j = n - 1; i < j; ++i, --j) {
            int x = nums[i], y = nums[j];
            while (y) {
                x *= 10; 
                y /= 10;
            }
            ans += x + nums[j];
        }
        if (n & 1) ans += (long long) nums[n / 2];
        return ans;
    }
};

复杂度分析:

  • 时间复杂度: O ( n log ⁡ U ) O(n\log U) O(nlogU) U U U 为最大的数字的位数。
  • 空间复杂度: O ( 1 ) O(1) O(1)

你可能感兴趣的:(#,双指针,leetcode,算法,职场和发展)