PTA算法题笔记,常使用的知识点
-
getline(cin,a);
C++中定义为string a;时,(注意:当输入一个字符s时,又输入一串带有空格 的字符串,要写getchar(),第一个字符1被char ch读取,所以getchar()依次读取下一个未读取字符2,用户键入的回车也算一个字符,所以这里getchar()把回车读取了,输出时体现为换行)
getchar();//接收上一个输入的跨行符,免得存入数组里
-
cin.get(a,100) cin.getline(a,100)
C++中定义为char a[100]时
-
scanf("%\n",a);
C语言中
-
string s;
getline(cin,s); -
string s[100]
for(int i=0;i<n;i++)
• getline(cin,s[i]); -
当输入一个数字或字符之后,后面要使用getline(cin,a)函数时,要在此之前写getchar()把上一次输入的跨行符吃掉,否则跨行符会被读入到下一次输入,如:
int n;
cin>>n;
getchar();
while(n--){
string a;
getline(cin,a);
}
2.头文件<algorithm>的常用函数
-
vector中的排序:sort(a,b)或者sort(a,b,cmp)
-
参数解释:a是数组首地址,b是数组尾地址,cmp是自定义比较函数。sort()函数默认是升序排序,如果要进行降序,则可以使用自定义函数cmp。
-
cmp函数定义:bool cmp(int a,int b){ return a>b; }
-
例子:sort(a,a+100,cmp) 降序
-
sort(nums.begin(),nums.end())
-
-
max(a,b)
-
//类似寻找最大最小值的题目,初始值一定要定义成理论上的最小最大值。如果定义成0,则复数无法比较。
int max = INT_MIN;
int min = INT_MAX;
3.unordered_map <int, int> m
-
unordered_map为无序map,存储int-int键值对。
-
常用函数:
-
m.count(num) 计算键为num的个数。m[num]是求键为num的值。
-
m.erase(num) 从指定容器中删除指定元素。
-
m.find(num) 查找键为num的值。
-
m.end() 最后一个
-
4.vector用法
vector<int> nums
(1)常用函数
-
nums.begin() nums.end() nums.size()
-
vector<int> nums 的nums.size()返回的是无符号整数,遍历时要转化为整数。即int(nums.size())
-
取最后一位:int a = nums.back()
-
删除最后一位:nums.pop_back()
-
在尾部添加一位:nums.push_back()
-
反转数组:reverse(num.begin(),nums.end())
(2)初始化
-
一维数组:
vector < int > v; //v的size是0
vector < int > v = {1,2,3,4,5};
vector < int > v(n);
vector < int > v(n,0); //size为n,初始值为0 -
二维数组:
vector < vector < int > > v; //v的size是0
//n*m二维数组,初始值为0
vector<vector<int>> v(n, vector<int>(m,0));
-
sort(i,j) //排序 i到j
5.求字符串长度
-
数组:char a[100]
-
strlen(a)
-
头文件:<cstring>
-
-
字符串:string a
-
a.lenth() (注:有时候需要转化为int才能比较)
-
a.size()
-
头文件:<cstring>
-
6. string 常用函数
(1)常用函数
string a = "jfiejj33_fji";
-
求长度:a.length()
-
求最后一个字符:a.back() == 'i'
-
求字串:a.substr(0,4) == "jfie" //从0开始,取4位
-
求字符串的第一个字符:a.begin() == 'j'
-
求字符串的最后一个字符的下一位:a.end() == '\0'
-
求字符串的最后一个字符:a.rbegin() == 'i'
-
求字符串的第一个字符的前一位:a.rend() 逆向
-
判断是否等于:a == b
-
增加字符串:a = a + "ji2";
(2)求长度
(3)比较大小
C ++字符串支持常见的比较操作符(>,>=,<,<=,==,!=)
// (A的ASCII码是65,a的ASCII码是97)
// 前面减去后面的ASCII码,>0返回1,<0返回-1,相同返回0
string A("aBcd");
string B("Abcd");
string C("123456");
string D("123dfg");
// "aBcd" 和 "Abcd"比较------ a > A 返回1
cout << "A.compare(B):" << A.compare(B)<< endl; // 结果:1
// "cd" 和 "Abcd"比较------- c > A 返回1
cout << "A.compare(2, 3, B):" <<A.compare(2, 3, B)<< endl;
(4)插入
-
尾插:s.push_back('a')
-
指定位置前插入:s.insert(i,'a')
string s1;
// ①尾插一个字符
s1.push_back('a');
s1.push_back('b');
s1.push_back('c');
cout<<"s1:"<<s1<<endl; // s1:abc
// ②insert(pos,char):在制定的位置pos前插入字符char
s1.insert(s1.begin(),'1');
cout<<"s1:"<<s1<<endl; // s1:1abc
(5)拼接
-
append()
-
+
string s1("abc");
s1.append("def"); //abcdef
s1+='a'; //abcdefa
(6)遍历
void test6()
{
string s1("abcdef"); // 调用一次构造函数
// 方法一: 下标法
for( int i = 0; i < s1.size() ; i++ )
{
cout<<s1[i];
}
cout<<endl;
// 方法二:正向迭代器
string::iterator iter = s1.begin();
for( ; iter < s1.end() ; iter++)
{
cout<<*iter;
}
cout<<endl;
// 方法三:反向迭代器
string::reverse_iterator riter = s1.rbegin();
for( ; riter < s1.rend() ; riter++)
{
cout<<*riter;
}
cout<<endl;
}
(7)string 删除
1. iterator erase(iterator p);//删除字符串中p所指的字符
2. iterator erase(iterator first, iterator last);//删除字符串中迭代器
区间[first,last)上所有字符
3. string& erase(size_t pos = 0, size_t len = npos);//删除字符串中从索引
位置pos开始的len个字符
4. void clear();//删除字符串中所有字符
void test6()
{
string s1 = "123456789";
// s1.erase(s1.begin()+1); // 结果:13456789
// s1.erase(s1.begin()+1,s1.end()-2); // 结果:189
s1.erase(1,6); // 结果:189
string::iterator iter = s1.begin();
while( iter != s1.end() )
{
cout<<*iter;
*iter++;
}
cout<<endl;
}
(8)string 字符替换
-
string& replace(size_t pos, size_t n, const char *s);将当前字符串
从pos索引开始的n个字符,替换成字符串s。
-
string& replace(size_t pos, size_t n, size_t n1, char c);将当前字符串从pos索引开始的n个字符,替换成n1个字符c。
void test7()
{
string s1("hello,world!");
cout<<s1.size()<<endl; // 结果:12
s1.replace(s1.size()-1,1,1,'.'); // 结果:hello,world.
// 这里的6表示下标 5表示长度
s1.replace(6,5,"girl"); // 结果:hello,girl.
// s1.begin(),s1.begin()+5 是左闭右开区间
s1.replace(s1.begin(),s1.begin()+5,"boy"); // 结果:boy,girl.
cout<<s1<<endl;
}
(9)string 大小写转化
-
tolower()
-
toupper()
for( int i = 0; i < s.size(); i++ )
{
s[i] = tolower(s[i]);
}
(10)string 查找
find()函数!!!
// 1. 查找一个字符串
cout << s.find("chicken") << endl;
// 2. 从字符串的末尾开始查找字符
cout << s.rfind('i') << endl;
// 3. 从下标为6开始找字符'i',返回找到的第一个i的下标
cout << s.find('i',6) << endl;
// 4. 在该字符串中查找第一个属于字符串s的字符
cout << s.find_first_of("13br98") << endl;
//若找不到字符串,则返回一个特别的标志
s.find(flag,position))!=string::npos
(11) string的排序
(12)String 截取字符串
string s1("0123456789");
string s2 = s1.substr(2,5);
// 结果:23456-----参数5表示:截取的字符串的长度
例题1:
例题2:
7. 英文字母转换
-
大写字母换小写:‘A’ + 32
-
小写字母换大写:'a' - 32
-
判断是否为字母:isalpha(a) 在头文件<ctype>
8.Π的取法
9.排序
头文件:#include <algorithm>
-
sort(a,a+n); //int a[101];
-
sort(a.begin(),a.end()); //vector<int> a;
10. C语言中位数不够0补齐
%02d :位数不够0补齐
11.C++中位数不够0补齐
cout<<setw(2)<<setfill('0')<<year<<setw(2)<<
setfill('0')<<month<<setw(2)<<setfill('0')<<day<<endl;
12. 判断str中是否含有str1
/*
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
*/
//注意要使用char*!!!!!!
s = strstr(s,str1);
if(s==NULL){ //注意c中是NULL
}else{
}
例子:
int main()
{
char* p1 = "abcdef"; //注意要使用char*!!!!!因为函数返回值是地址
char* p2 = "def";
// 在abcdef中找找def,找到的话返回它的地址,找不到返回空指针
char* rest = strstr(p1, p2);
if (rest == NULL)
{
printf("子串不存在\n");
}
else
{
printf("%s\n", rest);
}
return 0;
}
13.求最大公约数和最小公倍数
-
求最大公约数:欧几里得算法(gcd)
int gcd(int a,int b){
return b == 0 ? a : gcd(b,a%b);
} -
求最小公倍数:
//求i和j的最小公倍数
i*j/gcd(i,j);
//i和j的乘积/最大公约数
//如4和6的最大公约数:2,则最小公倍数为:4*6/2=12
14.排序+去重函数
关键函数:sort()、unique()
set会自动去重
-
遍历:
//遍历set,使用迭代器类型
for(set<int>::iter i=a.begin();i!=a.end();i++){
cout<<*i<<endl;
} -
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库