【备战秋招】——算法题目训练和总结day1😎

前言🙌
NC313 两个数组的交集
题目链接:两个数组的交集
我的题解思路分享
- 首先是认真审题,结合示例理解。
- 判断共同元素,我首先想到的是哈希思想。能使用数组来代替哈希表就用数组。因为容器的建立和使用都是有成本的,会影响解题效率。
- 这道题目的数据范围和数据个数都比较小。因此,我们可以用一个数组来代替哈希表。
- 先遍历其中一个nums1数组,在check中做好标记,check的下标表示的nums1数组的元素,存的值表示该元素在不在。遍历完后,就已在check中标记好了nums1数组各个元素。
- 然后遍历另外一个nums2数组。当发现该元素在check中已经存在时,便找到了两个数组的共同元素。将该元素添加到ret结果数组里面。特别注意的是需要将该元素在check中的删除它的存在,为什么这样做?因为它没有存在的必要了,而且它的存在,如果nums2数组后面还有相同的这个元素,会造成添加重复的共同元素进入ret中。
看了上述代码如果还是不太理解的小伙伴,可以尝试结合示例多看几遍题目,把握细节,然后再结合我的代码理解理解~。为了方便大家的学习,我的代码都写好注释啦
代码分享
class Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
//判断元素是否存在
bool check[1001] = {0};
vector<int> ret;
//遍历数组,并填充check,表示这些元素都已经存在了
for(const auto& n : nums1)
{
check[n] = true;
}
//遍历另外一个数组,如果为true,则找到共同元素
for(const auto& n : nums2)
{
if(check[n] == true)
{
ret.push_back(n);
//去除重复添加共同元素进入ret中(题目细节有说明,共同元素只添加一个就行)
check[n] = false;
}
}
return ret;
}
};
AB5 点击消除
题目链接: 点击消除
我的题解思路分享
- 首先是认真审题,结合示例理解。
- 这到题目和括号匹配时很类似的,解决办法都可以用栈的思路来解决。
- 首先先遍历s字符串的每一个字符和栈顶元素是否一样,一样就删除栈顶元素,不一样就入栈。但是我们这道题可以不用栈这个数据结构来搞,我们使用string来模拟栈就可以了。
- 我们需要注意一下,如果最后字符串都消除了,则返回“0”。
代码分享
#include<iostream>
using namespace std;
int main()
{
string ret = "";
string s;
cin >> s;
for(const auto& c : s)
{
//不相等就入栈
if(c != ret.back())
{
ret.push_back(c);
}
else//相等就出栈
{
ret.pop_back();
}
}
//判断字符串是否为空
if(ret.empty())
cout << "0";
else
cout << ret << endl;
return 0;
}