欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

寒假的120道pta的总结

程序员文章站 2022-07-04 21:09:30
...

写代码需考虑①变量的类型是string、int、long long、char、double这个very important!②输出的格式,通常和代码的整体架构有关,要求不要急于写,先构思,draw a picture in your brain, 整体结构想好了,再开始写。

1.string和char的转化

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	string s;
	s="123456";
	char c[s.length()];
	strcpy(c,s.data());
	cout<<c;
}

对于data(),很简单,他是string类的一个函数,作用是返回指向现有串的第一个字符的指针。

2.char转string(较简单)

#include<iostream>
using namespace std;

int main()
{
	char a[]=" abc  d\0efg "; 	
	
string s=a;  //直接赋值

cout<<s;	
return 0;

}

3.若需输入字符串的个数n,则在scanf(“%d”,&n);后千万千万记得加getchar();

4.需要输入多组数据时可以while(n–)

5.字符串的题通常需定义长度len

6.string不可用strcpy and strcmp,需要s.data();返回指针。
7.
第一:字符串中的数字转整型为-‘0’。
第二:小写转大写 减32,大写转小写 加32(小写的ascii码大于大写的ascii码)。
第三:字符串中大小写的转化通常需要定义两个大小一样的字符数组。或者string s ;char a[s.length]。而且还需要定义两个字符串的长度int len,n;

8.单个字符输入时需要&即
char c;
scanf("%c",&c);
but but but!!!
字符数组或者字符串输入时不!需!要!
举个栗子:
string s;
scanf(“%s”,s);

9.读入带有空格的字符串时可
getline(cin,s);
【attention】s只可为string,不可为char!!
or cin.getline(s);

10.cin和scanf的机理不同,ios见收藏,多看,理解。

11.map、set、vector
【字符串去重】

1.set给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序。

> for(int i=0;i<len;i++) st.insert(s[i]);//往set里面装东西用insert() 
> 	for(auto i=st.begin();i!=st.end();i++) //auto自动判断i的类型(automatic)
> cout<< *i;//输出需加取值符号

12.find()。erase()函数用来去子串

while(s1.find(s2)!=-1){
		pos = s1.find(s2);
		s1.erase(pos,s2.length());
	}

①s1.find(s2)返回子串s2第一个字母的在母串s1中的地址
不存在返回-1;
②erase(开始去除的下标,去除子串的长度s2,length())。

map:1.键值对:字符串string是键值是int型
2.直接实现对键的排序
话不多说,上代码!!
寒假的120道pta的总结
寒假的120道pta的总结

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

string str;
map <string,int> mp;
int flag=0;

int main(){
	//freopen("E:\\programme\\C++\\test.txt","r",stdin);
	
	while(cin >> str){
		mp[str]++;
	}
	
	for (auto it:mp){
		if (it.second == 1){
			if (flag) cout << it.first;
			else {
				cout << it.first << " ";
				flag=1;
			}
		}
	}
	
	return 0;
}

/①/freopen(“E:\programme\C++\test.txt”,“r”,stdin);可用于打开文件,freopen、“r”、stdin;

②it.first 是键,it.second 是值。
③ for(auto it:mp)循环的缩写

13.上个题中的cin是如何分次读取含有空格的字符串滴腻?

cin将读入字符串读入流中
关于c++中的标准输入流对象的应用可以参考一下这篇博文:
http://blog.csdn.net/k346k346/article/details/48213811

看不懂?反正就是可以读含有空格的字符串

14.写在主函数前面的内容,抄的大佬的,那你会背了,可就NB 了!!!
https://editor.csdn.net/md/?articleId=104354196

15.关于C++中ios::sync_with_stdio(false);取消同步
cin,cout之所以效率低,是因为先把要输出的东西存入缓冲区,再输出,导致效率降低,而这段语句可以来打消iostream的输入 输出缓存,可以节省许多时间,使效率与scanf与printf相差无几。

好处:iostream默认是与stdio关联在一起的,以使两者同步,因此消耗了iostream不少性能,设置为false后,不再同步了,iostream的性能提高了很多倍。

坏处:副作用:不能scanf cin之类的混用了。TLE?

搞不懂,慢慢来。

16.运行时间超时优化问题
来两个题:
例子1;
寒假的120道pta的总结寒假的120道pta的总结
寒假的120道pta的总结
↑↑↑↑↑↑这是个很大的数了

斐波那契数列每60个循环一回!!不知道吧,赶快装脑子里啊!!

#include<stdio.h>
int fact(int n){
	int r;
	if(n==1||n==2) return 1;
	else{
		r=fact(n-1)+fact(n-2);
		return r%10;
	} 
	
}
int main(){
	int n,x;
	scanf("%d",&n);
	x=fact(n%60);
	printf("%d",x);
}

例子2:
寒假的120道pta的总结
寒假的120道pta的总结
每70数中有16个符合题意,怎么知道的?

#include<iostream>
using namespace std;
int main()
{
	int i,n;
	int cnt=0;
	cin>>n;
	if(n>=70)
	{
		cnt=n/70*16;
	}
	int m = n%70;
	for(i=7;i<=m;i++)
	{
		if(i%7==0||i%10==7)
		{
			cnt++;
		}
	}
	cout<<cnt;
	return 0;
}

3。数组求和加强版(所以,注意题中变量的取值范围很重要)

17.求素数,六七行代码就搞定

int main()
{
	int n=9;
	int i;
	for(i=2;i<=sqrt(n);i++)//这种还不用考虑2,多爽!
	{
		if(n%i==0)  return 0;
	}
	cout<<"yes";
	return 0;
}

18.PI = 3.1415926535!!!还有535!!很重要!

emmmm。。。。暂时就这么多,命要紧……