1.数字统计
题目来源:数字统计——牛客网
测试用例
算法原理
根据题目我们知道,首先要输出两个数字确定一个区间,寻找这个区间内数字中所有包含2的个数,比如12包含一个2,22包含两个2,以此类推,所以我们的思路就是不断将区间内数字模10后继续除以10寻找该数字中的所有2,最后返回2的个数即可,整体难度简单建议直接秒杀
实战演练
#include <iostream>
using namespace std;
int main()
{
int l,r;
cin>>l>>r;
int sum = 0;
//注意for循环这里需要<=r,避免遗漏数据
for(int i = l;i <= r;i++)
{
//借助临时变量tmp来统计个数
//避免直接修改i
int tmp = i;
while(tmp)
{
//使用模运算统计2的个数
if(tmp % 10 == 2)
{
sum++;
}
//逐位统计2
tmp /= 10;
}
}
cout<<sum<<endl;
return 0;
}
2.两个数组的交集
题目来源:两个数组的交集——牛客网
测试用例
算法原理
本题的核心思路是哈希表,不过由于题目数据量较小,所以我们使用数组来替代,但是作用是相通的
1.首先创建一个布尔类型的哈希表,遍历第一个数组后将出现过的数字的位置设置为true,反之没出现的设置为false
2.然后使用这个哈希表去第二个数组比较,当第二个数组中的元素在相同的位置同样为true则代表是重复元素,此时就将其插入到vector容器中
注意:当重复字符为nums1{2,2,2,2} nums1{1,2,2}这样的类型时,我们只用返回{2}即可,所以接下来需要进行去重操作,即在遍历第二个数组时出现重复元素,在插入后需要将该元素所在的哈希表位置置为false,避免重复
实战演练
class Solution
{
private:
//数据小于1000,所以直接开辟1001大小的数组即可
bool hash[1001] = {0};
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2)
{
vector<int> v;
//遍历第一个数组修改哈希表
for(auto e : nums1)
{
hash[e] = true;
}
//遍历第二个数组寻找重复元素
for(auto ch : nums2)
{
if(hash[ch] == true)
{
//查找到重复元素后插入
v.push_back(ch);
//去重
hash[ch] = false;
}
}
return v;
}
};
3.点击消除
题目来源:点击消除——牛客网
测试用例
算法原理
本题的知识点主要是考验栈的运用,如果之前做过括号内道题的话就很容易做出本题, 这里我们使用一个string类来模拟栈,因为都是对尾部进行操作,所以减少一定消耗
1.首先输入一个字符串后,这时对另一个字符串进行尾插
2.当这时要插入的元素与模拟栈的字符串尾部元素相同,就要进行模拟出栈操作,即将模拟栈尾删即可,最后返回模拟栈,这时的模拟栈就是剩下的元素
实战演练
#include <iostream>
#include<string>
using namespace std;
int main()
{
string s;
string st;
cin>>s;
for(int i = 0;i < s.size();i++)
{
if(s[i] != st.back())
{
//与栈顶元素不相同就入栈
st.push_back(s[i]);
}
else
{
//与栈顶元素相同就出栈
st.pop_back();
}
}
if(st.empty())
{
cout<<0<<endl;
}
else
{
cout<<st<<endl;
}
return 0;
}