一、输入输出
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的背包,价值总和最大是多少。
例题
#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