【每日一题】2562. 找出数组的串联值


2562. 找出数组的串联值

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

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

例如,15 和 49 的串联是 1549 。
nums 的 串联值 最初等于 0 。执行下述操作直到 nums 变为空:

如果 nums 中存在不止一个数字,分别选中 nums 中的第一个元素和最后一个元素,将二者串联得到的值加到 nums 的 串联值 上,然后从 nums 中删除第一个和最后一个元素。
如果仅存在一个元素,则将该元素的值加到 nums 的串联值上,然后删除这个元素。
返回执行完所有操作后 nums 的串联值。

详见: 2562. 找出数组的串联值


一、answer1

直接模拟,寻找下标与 i 的变化规律。这里用到了 stol()to_string() 两个函数分别将string转换为long、将int转为string,方便直接拼接。

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

二、answer2

用数学方法计算串联值,用到了 log10()pow() 函数来求数字位数:

//pow函数返回 base 的 exponent 次幂的结果
#include <cmath>
double pow(double base, double exponent);


int a,b;
int k=log10(b)+1;
return a*pow(10,k)+b;
/*
或者使用floor()函数
return a*pow(10,floor(k=log10(b)+1))+b;
*/

完整代码如下:

class Solution {
    
    
public:
    long long findTheArrayConcVal(vector<int>& nums) {
    
    
        int n=nums.size();
        long res=0;
        int k=0;
        for(int i=n;i>0;i-=2){
    
    
            k=(n-i)/2;
            if(i==1){
    
    
                return res+nums[n/2];
            }
            res+=nums[k]*pow(10,floor(log10(nums[n-k-1])+1))+nums[n-k-1];
        }
        return res;
    }
};

收获

学习了四个函数:
stoi( ), stol( ), stoll( ) ;
to_string( ) ;
log10( ) ;
pow( ) .

猜你喜欢

转载自blog.csdn.net/qq_45734610/article/details/133796150