第五天!
第一题:LeetCode1720
首先,我们先来读懂题目什么意思:
encoded[i]=arr[i] XOR arr[i+1]
输入:encoded = [1,2,3], first = 1
输出:[1,0,2,1]解释:若 arr = [1,0,2,1] ,那么 first = 1 且 encoded = [1 XOR 0, 0 XOR 2, 2 XOR 1] = [1,2,3]
encode[i-1]=arr[i-1] XOR arr[i]
encode[i-1] XOR arr[i-1]=arr[i-1] XOR arr[i] XOR arr[i-1]
encode[i-1] XOR arr[i-1]=arr[i-1] XOR arr[i-1] XOR arr[i]
encode[i-1] XOR arr[i-1]=0 XOR arr[i]encode[i-1] XOR arr[i-1]=arr[i]
因为arr[0]已经给出,所以从arr[i]开始。。
解题思路:
首先,创建一个长度为 n+1 的数组 arr,用于存储解码后的原数组。这是因为编码后的数组长度为 n,而我们需要还原出原始数组,所以需要额外的一个位置来存储第一个元素。将给定的第一个元素 first 赋值给 arr[0]。这个元素是已知的,不需要进行解码。遍历编码后的数组 encoded,从第二个元素开始(即索引为 1 的元素)。对于每个元素,使用异或运算还原原数组的元素。具体来说,将当前元素与前一个元素进行异或运算,得到的结果就是原数组中对应的元素。将还原出的原数组返回。
class Solution {
public:
vector<int> decode(vector<int>& encoded, int first) {
vector<int>arr(encoded.size()+1);//创建一个长度为n的数组,用于存储解码后的原数组
arr[0]=first;
for(int i=0;i<encoded.size();i++)//遍历编码后的数组,从第二个元素开始
{
arr[i+1]=arr[i]^encoded[i];//使用异或运算还原数组的元素
}
return arr;
}
};
第二题:LeetCode2574
解题思路:
首先计算输入数组的前缀和和后缀和。前缀和表示从数组第一个元素到当前元素的累加和,后缀和表示从数组最后一个元素到当前元素的累加和。然后遍历数组,对于每个位置i,计算其前缀和与后缀和之差的绝对值,将结果存储在ans数组中最后返回ans数组作为结果。
class Solution {
public:
vector<int> leftRigthDifference(vector<int>& nums) {
// 获取数组长度
int n = nums.size();
// 初始化结果数组,长度与输入数组相同
vector<int> ans(n);
// 初始化前缀和数组,长度与输入数组相同
vector<int> ls(n);
// 初始化后缀和数组,长度与输入数组相同
vector<int> rs(n);
// 预处理求出前缀和
for (int i=0; i < n; i ++)
{
// 如果是第一个元素,前缀和就是它本身
if (i==0) ls[i] = nums[i];
// 否则,前缀和等于前一个元素的前缀和加上当前元素
else ls[i] = ls[i-1] + nums[i];
}
// 预处理求出后缀和
for (int i=n-1; i >= 0; i --)
{
// 如果是最后一个元素,后缀和就是它本身
if (i == n-1) rs[i] = nums[i];
// 否则,后缀和等于后一个元素的后缀和加上当前元素
else rs[i] = rs[i+1] + nums[i];
}
// 构造ans数组:
for (int i=0; i < n; i ++)
// ans数组的每个元素等于对应位置的前缀和与后缀和之差的绝对值
ans[i] = abs(ls[i] - rs[i]);
return ans;
}
};
今天肝不动啦太困咯~想学点有意思滴!依旧是明天见嘻嘻!
标签:arr,XOR,前缀,后缀,元素,力扣,数组,LeetCode,刷题 From: https://blog.csdn.net/2301_77031350/article/details/140161573