笔试编程-百战成神——Day01

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;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值