c++语言快速入门牛客网刷题

一、输入输出

1. 输入一整行;

#include <sstream>
string s;
getline(cin,s);
while(getline(cin,s,';')){} //s是以分号分隔后的每一个字符串

2.cin输入,遇到空格就是下一个输入;cout输出,输出的内容间没有间隔;

int a;
cin>>a;
cout<<a;

二、字符型相关函数

1. ASCII码 A为65 a为97,大小写字母ASCII码相差32;大/小写字母一共26个。

2. 字符型可以直接比大小。(会按照ASCII码来比)

string s;
getline(cin,s);
int isletter=0, isspace=0, isnum=0, other=0;
for(int i=0;i<s.size();i++){ //或者s.length()
    if(s[i]>='A'&& s[i]<= 'Z'){
        isletter++;
    }
    else if(s[i]>='a'&& s[i]<= 'z'){
        isletter++;
    }
    else if(s[i]==' '){
        isspace++;
    }
    else if(s[i]>='0'&& s[i]<= '9'){
        isnum++;
    }
    else{
        other++;
    }
}

2.判断字符是否为字母(a-z和A-Z)   函数

char c;
if(!isalpha(c)) {};

三、字符串相关函数

1. 查找某个字符或字符串是否存在 find()

2.把字符串转换为整型 stoi(s);

string s1("babbabab");
cout << s1.find('a') << endl;//找到返回出现的下标(整型),找不到返回-1
cout << s1.find('a', 1) << endl;//从第一个字符开始找。
if(s1.find('a') == -1) return false;

stoi(s1);

//取子串
string s="sfsa";
string a=s.substr(0,3);//sfs 
string c=s.substr(1);//fsa 从哪个下标开始,截取多少,省略就截取到末尾、
string c=s.substr(2,3);//sa

三、istringstream的使用 类似于cin

string s="I am a Student";
//利用 istringstream 重弄一个输入流 类似于cin
istringstream strm(s);  //strm里就是s的内容
string word;
while(strm>>word){
    
}

四、#include <bits/stdc++.h>万能头文件

五、容器vector

1.定义一个vector

vector<int> a(n+1); //定义了n+1个整型元素的向量
vector<int> a(5,1); //定义了5个整型元素的向量,且给出每个元素的初值为1
vector<int> a(b); //用b向量来创建a向量,整体复制性赋值

2.函数

vector<int> vec;
vec.push_back(3);
sort(vec.begin(),vec.end());

六、栈stack

string s;
stack<string> sta;
while(cin>>s){
    sta.push(word); //将元素压入栈
}
while(!sta.empty()){ //栈是否为空
    cout<<sta.top()<<' '; //栈顶部元素
    sta.pop();//出栈
}

七、键值对map

	map<char,int> maps;
	map<char,int>::iterator it;
    it=maps.find('c');
    if(it!=maps.end()){
		maps['c']=1;
	}
    cout<<it->first<<endl;
    cout<<it->second<<endl;

八、Pair

pair<int, int> res;
res={3,4};
cout<<res.first<<endl<<res.second<<endl;

冒泡排序

//从小到大排序,每一轮两两比较,冒出一个最大的在最后面。
for(int i=0;i<s.size();i++){ 
    for(int j=1;j<s.size();j++){
        if(s[j]<s[j-1]){  
            char temp=s[j-1];
            s[j-1]=s[j];
            s[j]=temp;
        }
    }
}

链表 双指针

例题 输出单向链表中倒数第k个结点

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

struct ListNode{//链表结点
    int val;
    ListNode* next;
    ListNode(int x):val(x),next(NULL) {} //初始化
};
//快慢双指针,快指针先走K步,当快指针走到尽头,慢指针正好指向倒数第k个元素
//需要注意,如果快指针开始走不够k步,链表过短,则返回空。
ListNode* FindK(ListNode* phead, int k){//需要倒数第k个,链表头指针
    ListNode* fast=phead;
    ListNode* slow=phead;
    for(int i=0;i<k;i++){
        if(fast!= NULL)
            fast=fast->next;
        else
            return slow = NULL;
    }
    while(fast!=NULL){
        fast=fast->next;
        slow=slow->next;
    }
    return slow;
}

int main() {
    int n;
    while(cin>>n){
        int val;
        cin>>val;
        ListNode *head=new ListNode(val);
        ListNode *p=head;
        for(int i=1;i<n;i++){ //构造链表
            cin>>val;
            ListNode *q=new ListNode(val);
            p->next=q;
            p = p->next;
        }

        int k;
        cin>>k;  //输入k
        p=FindK(head,k);
        if(p!=NULL){
            cout<<p->val<<endl;
        }
    }
    return 0;
}

递归 

例题 统计每个月兔子总数

有一种兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子。题解 | #统计每个月兔子的总数#_牛客博客 (nowcoder.net)

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int count(int n){
    if(n==1||n==2){
        return 1;
    }
    return count(n-1)+count(n-2);
}

int main() {
    int n;
    cin>>n;//n个月
    cout<<count(n)<<endl;
}

0-1背包问题 动态规划

咱就把0-1背包问题讲个通透! - 知乎 (zhihu.com)dp[i][j] 表示从下标为[0-i]的物品里任意取,放进容量为j的背包,价值总和最大是多少

例题

购物单_牛客题霸_牛客网 (nowcoder.com)

#include <iostream>
#include<bits/stdc++.h>
using namespace std;

int main() {
    int N, m; //N总钱数,m物品个数
    cin >> N >> m;
    vector<vector<int>> value(m+1, vector<int>(3,0)); //多行三列,每一列分别存放主件、附件1、附件二的价格
    vector<vector<int>> weight(m+1, vector<int>(3, 0)); //多行三列,存重要度
    for (int i = 1; i <=m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        if (c == 0) {
            value[i][0] = a;
            weight[i][0] = b;
        } else {
            if (value[c][1] == 0) {
                value[c][1] = a;
                weight[c][1] = b;
            } else {
                value[c][2] = a;
                weight[c][2] = b;
            }
        }
    }
    //构建dp  0-1背包 下标为0至i的物品里任意取,取重量为j的物品
    vector<vector<int>> dp(m + 1, vector<int>(N + 1, 0));
    //从0开始,所以是N+1
    //初始化dp
    for (int i = 1; i < m + 1; i++) {
        for (int j = 1; j < N + 1; j++) {
            int a = value[i][0], b = weight[i][0];
            int c = value[i][1], d = weight[i][1];
            int e = value[i][2], f = weight[i][2];
            dp[i][j] = j > a ? max(dp[i - 1][j], dp[i - 1][j - a] + a * b) : dp[i - 1][j];
            dp[i][j] = j >= a + c ? max(dp[i - 1][j - a - c] + a * b + c * d,dp[i][j]) : dp[i][j];
            dp[i][j] = j >= a + e ? max(dp[i - 1][j - a - e] + a * b + e * f,dp[i][j]) : dp[i][j];
            dp[i][j] = j >= a + c + e ? max(dp[i - 1][j - a - e - c] + a * b + c * d + e *f, dp[i][j]) : dp[i][j];
        }
    }
    cout<<dp[m][N]<<endl;

}

解题思路

1.遇到应用题,可以先举例罗列,找到数学规律

INT_MIN

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值