【c++日常刷题】两个数字的交集、点击消除、最小花费爬楼梯

两个数字的交集⭐

两个数组的交集_牛客题霸_牛客网 (nowcoder.com)

题目描述:

解题思路:

通过遍历num1,如果遍历到的元素如果在num2中能找到,则这是num1和num2的公告元素;

这里需要借助两个数组来实现:

代码:

class Solution {
public:
    vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
        int t=min(nums1.size(),nums2.size());
        vector<int>f;
        unordered_set<int>a;
        unordered_set<int>b(nums2.begin(),nums2.end());
        for(auto e:nums1){
            if(b.find(e)!=b.end()&&a.find(e)==a.end()){
                f.push_back(e);
                a.insert(e);
            }
        }
        return f;
    }
};

点击消除⭐⭐

点击消除_牛客题霸_牛客网 (nowcoder.com)

题目描述:

 解题思路:(两种)

第一种:

采用压栈,出栈的方法:

入栈前要判断一下要入栈的元素和栈顶元素是否一样,一样则栈顶元素出栈,否则该元素入栈;

代码:

#include <iostream>
using namespace std;

int main() {
    string s;
    cin>>s;
    string a;
    for(auto e:s){
        if(a.empty()){
            a.push_back(e);
        }
        else if(a.back()==e){
            a.pop_back();
        }
        else{
            a.push_back(e);
        }
    }
    if(a.empty())cout<<'0'<<endl;
    else cout<<a<<endl;
}

第二种:

用迭代器来写,题目要求消除相邻的两个一样的,那么就依次遍历如果遍历到的元素和下一个元素一样,则删除这两个元素,注意:如果现在指向元素的前一个存在的话要把他给--;

代码:

#include <iostream>
using namespace std;

int main() {
    string s;
    cin>>s;
    string::iterator it=s.begin();
    while(it!=s.end()){
        if(*it==*(it+1)){
            it=s.erase(it,it+2);
        }
        else if(*(it-1)&&*it==*(it-1)){
            it=s.erase(it-1,it+1);
        }
        else{
            it++;
        }
    }
    if(s.empty())cout<<'0'<<endl;
    else
    cout<<s<<endl;
}

最小花费爬楼梯⭐⭐

最小花费爬楼梯_牛客题霸_牛客网 (nowcoder.com)

题目描述:

思路:

动态规划,到达第i个台阶的花费b[i]=min(b[i-1]+a[i-1],b[i-2]+a[i-2]);

代码:

#include <iostream>
using namespace std;

int main() {
   int n;
   cin>>n;
   int a[n+1],b[n+1];
   for(int i=0;i<n;i++)cin>>a[i];
   b[0]=0,b[1]=0;
   for(int i=2;i<=n;i++){
    b[i]=min(b[i-1]+a[i-1],b[i-2]+a[i-2]);
   }
   cout<<b[n]<<endl;

}

 数组中两个字符串的最小距离⭐⭐

数组中两个字符串的最小距离_牛客题霸_牛客网 (nowcoder.com)

题目描述:

思路:

模拟+贪心

代码:

#include <iostream>
#include<math.h>
using namespace std;

int main() {
    int n;
    string str1, str2;
    cin >> n;
    cin>>str1>>str2;
    int pre1=-1,pre2=-1,ret=0X3f3f3f;
    string s;
    for(int i=0;i<n;i++){
        cin>>s;
        if(s==str1)pre1=i;
        else if(s==str2)pre2=i;
        if(pre1!=-1&&pre2!=-1){
            ret=min(ret,abs(pre1-pre2));
        }
    }
    if(pre1==-1||pre2==-1)cout<<"-1"<<endl;
    else
    cout<<ret<<endl;

}

简写单词⭐

简写单词_牛客题霸_牛客网 (nowcoder.com)

题目描述:

思路:

本题比较简单,主要是注意一下ASCII的大小写字母的转换:

a->97

A->65

代码:

#include <iostream>
using namespace std;

int main() {
    string s;
    string a;
    while(cin>>a){
        if('A'<=a[0]&&a[0]<='Z')s+=a[0];
        else{
            s+=a[0]-32;
        }
    }
    cout<<s<<endl;
}

dd爱框框⭐⭐⭐

dd爱框框 (nowcoder.com)

题目描述:

思路:

滑动窗口:

代码:

#include<iostream>
using namespace std;
int n,x;
int main(){
    cin>>n>>x;
    int a[n];
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    int ret=0X3f3f3f;
    int l=-1,r=-1;
    int ll=0,rr=0;
    int sum=0;
    while(rr<n){
        sum+=a[rr];
        while(sum>=x){
            if(ret>(rr-ll+1)){
                ret=rr-ll+1;
                r=rr;
                l=ll;
            }
            sum-=a[ll];
            ll++;
        }
        rr++;
    }
    cout<<l+1<<" "<<r+1<<endl;
}

除2!⭐⭐⭐

除2! (nowcoder.com)

题目描述:

思路:

用优先队列(大堆),在放入数据后自动排序,sum记录数组总和;每次操作,从头遍历,如果是偶数把这个数/2,更新sum,不是的话,直接pop(),因为我们已经用sum记录数据总和,pop()后不会影响sum;

注意数据大小(long long);

代码:

#include<iostream>
#include<queue>
using namespace std;
int n,k;
int main(){
    cin>>n>>k;
    priority_queue<long long >q;
    long long sum=0;
    for(int i=0;i<n;i++){
        int a;
        cin>>a;
        q.push(a);
        sum+=a;
    }
    while(k--){
        for(int i=0;i<q.size();i++){
            if(q.top()%2==0){
                int t=q.top()/2;
                q.pop();
                q.push(t);
                sum-=t;
                break;
            }
            else{
                q.pop();
            }
        }
    }
    cout<<sum<<endl;
}

主持人调度一⭐⭐⭐

主持人调度(一)_牛客题霸_牛客网 (nowcoder.com)

题目描述:

思路:

本题主要就是二维数组的排序,sort可以直接排;

依[[33,38],[90,92],[87,88],[98,100],[20,32],[11,12],[45,57],[2,4],[63,71],[73,75],[95,96],[13,19]]样例为例;

排序后:

我们只需要判断每一行的第一个数是否大于上一行的第一个数;

如果都大于的话,则返回true;注意:这里要从第二行开始判断⭐

代码:

bool hostschedule(vector<vector<int> >& schedule) {
        sort(schedule.begin(),schedule.end());
        int t=schedule[0][1];
        
        for(int i=1;i<schedule.size();i++){
            if(schedule[i][0]<t){
                return false;
            }
            t=schedule[i][1];
        }
        return true;

    }

分割等和子集⭐⭐⭐⭐

分割等和子集_牛客题霸_牛客网 (nowcoder.com)

题目描述:

思路:本质就是01背包问题:第i个数取还是不取;

代码:

#include <iostream>
#include<cstring>
using namespace std;
const int N=505,M=505*110/2;
int n;
int a[N];
bool f[N][M];
int main() {
    cin>>n;
    int sum=0;
    for(int i=0;i<n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    if(sum%2!=0){
        cout<<"false"<<endl;
    }
    else{
        sum/=2;
        f[0][0]=true;
        for(int i=1;i<n;i++){
            for(int j=0;j<=sum;j++){
                if(j<a[i])
                {
                    f[i][j]=f[i-1][j];
                }
                else{
                    f[i][j]=f[i-1][j]||f[i-1][j-a[i]];
                }
            }
            if(f[i][sum]){
                cout<<"true"<<endl;
                return 0;
            }
        }
    }
}

小红的ABC⭐⭐

小红的ABC (nowcoder.com)

题目描述:

思路:

依次遍历:分别判断即可;

注意:reserve的使用;头文件:<algorithm>

如:

string a;

reverse(a.begin(),a.end());  

代码:

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;

int main(){
    string s;
    cin>>s;
    int t=0X3f3f3f;
    for(int i=0;i<s.size();i++){
        string b;
        b+=s[i];
        for(int j=i+1;j<s.size();j++){
            b+=s[j];
            string c=b;
            reverse(b.begin(),b.end());
           // cout<<c<<" "<<b<<endl;
            if(c==b&&b.size()<t){
                t=b.size();
                break;
            }
            b=c;
        }
    }
    if(t==0X3f3f3f){
        cout<<"-1"<<endl;
    }
    else
   { cout<<t<<endl;}
}

不相邻取数⭐⭐⭐

不相邻取数_牛客题霸_牛客网 (nowcoder.com)

题目描述:

思路:(打家劫舍dp)

对于不取的情况又要判断一下:第i-1的前一个是取还是不取------->可得dp方程;

代码:

#include <iostream>
using namespace std;

int main() {
    int n;
    cin>>n;
    int a[n];
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    int f[n][2];
    f[0][0]=0;
    f[0][1]=a[0];
    for(int i=1;i<n;i++){
        f[i][1]=f[i-1][0]+a[i];
        f[i][0]=max(f[i-1][0],f[i-1][1]);
    }
    cout<<max(f[n-1][0],f[n-1][1]);
    
}

上一篇:我的创作纪念日


下一篇:谈谈如何让测试用例更有价值