85. 解码异或之后的数组(简单)
题目要求:
未知 整数数组arr
由 n 个非负整数组成。
经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。
给定编码后的数组encoded
和原数组 arr 的第一个元素arr[0]
。
请解码返回原数组 arr 。可以证明答案存在并且是唯一的。
题目分析:
根据题意,encoded[i] = arr[i] ⊕ arr[i+1],则有encoded[i - 1] = arr[i - 1] ⊕ arr[i],等号两边同时异或arr[i−1],得到:
所以有arr[i] = arr[i - 1] ⊕ encoded[i - 1] ,根据此公式计算原arr即可。
题目解答:
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>
class Solution
{
public:
vector<int> decode(vector<int>& encoded, int first)
{
int n = encoded.size() + 1;
vector<int> arr(n); // 创建空数组
arr[0] = first;
for (int i = 1; i < n; i++)
{
arr[i] = arr[i - 1] ^ encoded[i - 1]; // 根据推导公式反推得到原数组
}
return arr;
}
};
int main()
{
vector<int> encoded = { 1,2,3 };
int first = 2;
Solution s;
cout << "编码后数组为:";
for (int e : encoded)
{
cout << e;
}
cout << endl;
vector<int> res = s.decode(encoded, first);
cout << "原数组为:";
for (int a : res)
{
cout << a;
}
cout << endl;
system("pause");
return 0;
}
86. 找到最高海拔(简单)
题目要求:
有一个自行车手打算进行一场公路骑行,这条路线总共由n + 1
个不同海拔的点组成。自行车手从海拔为 0 的点开始骑行。
给你一个长度为 n 的整数数组 gain ,其中 gain[i] 是点 i 和点 i + 1 的 净海拔高度差(0 <= i < n)。请你返回 最高点的海拔 。
题目分析:
根据题意,设i点处的海拔高度为 r i r_i ri,则有 r i = g a i n [ i − 1 ] + g a i n [ i ] r_i = gain[i - 1] + gain[i] ri=gain[i−1]+gain[i],按此方式遍历gain数组即可。
题目解答:
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>
class Solution
{
public:
int largestAltitude(vector<int>& gain)
{
int ans = 0, sum = 0;
for (int x : gain)
{
sum += x; // 累加获得每个点的海拔
ans = max(ans, sum); // 将当前海拔和上一次的海拔比较大小
}
return ans;
}
};
int main()
{
vector<int> gain = { -5,1,5,0,-7 };
Solution s;
cout << "海拔高度差为:";
for (int h : gain)
{
cout << h << ", ";
}
cout << endl;
int res = s.largestAltitude(gain);
cout << "最高海拔为:" << res << endl;
system("pause");
return 0;
}
87. 唯一元素的和
题目要求:
给定一个整数数组nums
。数组中唯一元素是那些只出现恰好一次
的元素。
请返回 nums 中唯一元素的和 。
题目解答:
#include <iostream>
using namespace std;
#include <string>
#include <vector>
#include <algorithm>
#include<unordered_map>
class Solution
{
public:
int sumOfUnique(vector<int>& nums, unordered_map<int, int>& state)
{
int ans = 0;
// 用哈希表存储每个元素的值和对应的状态,状态1代表只出现一次,状态2代表出现至少2次
for (int num : nums)
{
if (state[num] == 0)
{
ans += num;
state[num] = 1;
}
else if (state[num] == 1)
{
ans -= num;
state[num] = 2;
}
}
return ans;
}
};
int main()
{
vector<int> nums = { 1,2,3,2 };
unordered_map<int, int> state;
Solution s;
cout << "数组中的元素为:";
for (int num : nums)
{
cout << num << ", ";
}
cout << endl;
int res = s.sumOfUnique(nums, state);
cout << "仅出现一次的元素为:";
for (int num : nums)
{
if (state[num] == 1)
{
cout << num << ", ";
}
}
cout << endl;
cout << "数组中唯一元素的和为:" << res << endl;
system("pause");
return 0;
}