力扣刷题总结 -- 数组29

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 - 1] ⊕ encoded[i - 1] = arr[i - 1] ⊕ arr[i - 1] ⊕ arr[i]
arr[i - 1] ⊕ encoded[i - 1] = 0 ⊕ arr[i]
arr[i - 1] ⊕ encoded[i - 1] = arr[i]

所以有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[i1]+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;
}
  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值