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;
}