字符串类问题
1014加密算法
简单,过
1012字符移动
原做法
借助了两个字符串
#include<iostream>
#include <string>
#include<cstdlib>
using namespace std;
int main()
{
string s1;
cin>>s1;
string s2=s1;
string s3=s1;
int len=s1.size();
int cnt1=0;
int cnt2=0;
for(int i=0;i<len;i++)
{
if(s1[i]>='0'&&s1[i]<='9')//是数字
s2[cnt1++]=s1[i];
else
s3[cnt2++]=s2[i];
}
s2=s2.substr(0,cnt1);
s3=s3.substr(0,cnt2);
s1=s3+s2;
cout<<s1<<endl;
system("pause");
return 0;
}
改进1
对字符串运算的改进
#include<iostream>
#include <string>
#include<cstdlib>
using namespace std;
int main()
{
string s1,s2="",s3="";
cin>>s1;
int len=s1.size();
for(int i=0;i<len;i++)
{
if(s1[i]>='0'&&s1[i]<='9')//是数字
s2+=s1[i];
else
s3+=s1[i];
}
cout<<s3<<s2<<endl;
system("pause");
return 0;
}
其实只需要在输出做手脚即可
#include<bits/stdc++.h>
using namespace std;
int main()
{
/*题目并非要求改变字符串顺序,只需按照前非数字字符后数字字符输出即可*/
string s;
string number="";//数字字符串
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]>='0'&&s[i]<='9')//数字字符,保存最后输出
number+=s[i];
else
cout<<s[i];//非数字则直接输出
}
cout<<number;
return 0;
}
1292
简单
注意数组初始化写法
#include<iostream>
#include <string>
#include<cstdlib>
using namespace std;
int main()
{
string s;
while(cin>>s)
{
int a[26]={0};
int len=s.size();
for(int i=0;i<len;i++)
if(s[i]>='A'&&s[i]<='Z')
a[s[i]-'A']++;
for (int i=0;i<26;i++)
{
cout<<char('A'+i)<<":"<<a[i]<<endl;
}
}
system("pause");
return 0;
}
1240 首字母大写
缺了这两个导致编译不过
#include<string.h>
#include <stdio.h>
#include <bits/stdc++.h>
using namespace std;
int main()
{
char s[105];
while(gets(s))
{
int len=strlen(s);
int flag=0;
for(int i=0;i<len;i++)
{
if(flag==0&&s[i]>='a'&&s[i]<='z')
{
s[i]=s[i]-'a'+'A';
flag=1;
}
else if(s[i]==' ')
flag=0;
}
for(int i=0;i<len;i++)
printf("%c",s[i]);
printf("\n");
}
//system("pause");
return 0;
}
1394统计单词
思路简单 过
1414
简单
1027 删除字符串
伪删除
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
int len=s.size();
int a[100]={0};
for(int i=0;i<len-2;i++)
if(tolower(s[i])=='g'&&tolower(s[i+1])=='z'&&tolower(s[i+2])=='u')
{
a[i]=1;a[i+1]=1;a[i+2]=1;
}
for(int i=0;i<len;i++)
if(a[i]==0)
cout<<s[i];
cout<<endl;
//system("pause");
return 0;
}
排序
一个sort打天下
注意:stable_sort
1151成绩排序
代码中的sort()使用很有参考意义
以及比较函数的写法
#include <iostream>
#include <string>
#include <string.h>
#include<algorithm>
using namespace std;
struct student
{
string name;
int gore;
}stu[2000];
bool compare1(student a,student b)//从大到小
{
return a.gore>b.gore ;
}
bool compare2(student a,student b)//从小到大
{
return a.gore <b.gore ;
}
int main()
{
int n,way;
cin>>n>>way;
for(int i=0;i<n;i++)
{
cin>>stu[i].name;
cin>>stu[i].gore;
}
if(way==0)
stable_sort(stu,stu+n,compare1);
else
stable_sort(stu,stu+n,compare2);
for(int i=0;i<n;i++)
cout<<stu[i].name <<" "<<stu[i].gore <<endl;
system("pause");
return 0;
}
1106
标记,很复杂 ,有时间再做
1159
直接在sort里面操作,主要还是比较函数的写法
1217
简单,直接过
需要注意的是c++中自带可以比较字符串,按照字典顺序输出
1227
还是sort
主要是对这个行怎么进行拆分
亦可只提取时间,最后比较完整个输出字符串
#include <iostream>
#include <string>
#include <string.h>
#include<algorithm>
using namespace std;
struct T
{
string name;
string time;
string run;
}t[10000];
bool compare(T t1,T t2)
{
if(t1.run ==t2.run )
return t1.time<t2.time;
else
return t1.run<t2.run;
}
int main()
{
string s;
int cnt=0;
while(getline(cin,s))
{
if(s=="") break;
int len=s.size();
int i=0,j=0;
for(i=len-1;i>=1;i--)
{
if(s[i]!=' '&&s[i-1]==' ')
{
t[cnt].run=s.substr(i,len-i);//获取运行时间
break;
}
}
for(j=0;j<len-1;j++)
{
if(s[j]==' '&&s[j+1]!=' ')
{
t[cnt].name =s.substr(0,j+1);
t[cnt].time=s.substr(j+1,i-j-1);
break;
}
}
cnt++;//统计个数
}
sort(t,t+cnt,compare);
for (int k=0;k<cnt;k++)
{
cout<<t[k].name <<t[k].time <<t[k].run <<endl;
}
system("pause");
return 0;
}
1248整数奇偶排序
简单
1254字符串排序
简单
1255 字符串排序
记录
sort函数的参数,字符串用字符串下标
有额外信息还是用结构体好,不要反复横跳
#include <iostream>
#include <string>
#include <string.h>
#include<algorithm>
using namespace std;
struct zifu
{
char zi;
int id;
}str[500];
bool compare(zifu a,zifu b)
{
if(tolower(a.zi)==tolower(b.zi))
return a.id<b.id;
else
return tolower(a.zi)<tolower(b.zi);
}
int main()
{
string s;
while(getline(cin,s))
{
string s1="";
int len=s.size();
int cnt=0;
for(int i=0;i<len;i++)
if(s[i]>='A'&&s[i]<='z')
{
str[cnt].zi=s[i];
str[cnt].id =cnt;
cnt++;
}
sort(str,str+cnt,compare);
int j=0;
for(int i=0;i<len;i++)
if(s[i]>='A'&&s[i]<='z')
s[i]=str[j++].zi ;
cout<<s<<endl;
}
//system("pause");
return 0;
}
1261字符串
后面使用getline 前面是cin 记得加getchar 消除回车
1294后缀子串排序
记录:
如果使用vector容器,则用这样写,不然编译老是错。
sort(s2.begin(),s2.end(),compare);
vector.end()指向的是最后一个元素的下一个位置
vector相关
#include <bits/stdc++.h>
using namespace std;
bool compare(string a,string b)
{
return a<b;
}
int main()
{
string s;
string s2[1000];
while(cin>>s)
{
int len=s.size();
for(int i=0;i<len;i++)
{
string a=s.substr(i,len-i);
s2[i]=a;
}
sort(s2,s2+len,compare);
for (int i=0;i<len;i++)
cout<<s2[i]<<endl;
}
return 0;
}
1338
和之前的排序题目一样,没意思
1360
简单
1399
sort秒杀
1400
特殊排序
简单
1404
简单 老一套
1412
大数排序
简单
秒杀
#include<bits/stdc++.h>
using namespace std;
int n;
string s[110];
bool cmp(string a, string b)
{
if (a.length() == b.length())
return a < b;
else
return a.length() < b.length();
}
int main()
{
while (cin >> n)
{
for (int i = 0; i < n; i++)
cin >> s[i];
sort(s, s + n, cmp);
for (int i = 0; i < n; i++)
cout << s[i] << endl;
}
return 0;
}
1310
思路简单,细节很多
记录:
奖牌去重的写法
#include <iostream>
#include <string>
#include <string.h>
#include<algorithm>
#include <vector>
using namespace std;
struct country
{
int id;
int jin;
int yin;
int jiang;
int sum;
float jin_rat;
float jiang_rat;
int flag;
int pai[4];
int paiming;
int way;
}coun[1000];
bool compare_1(country a,country b)
{
return a.jin>b.jin;
}
bool compare_2(country a,country b)
{
return a.jiang>b.jiang;
}
bool compare_3(country a,country b)
{
return a.jin_rat>b.jin_rat;
}
bool compare_4(country a,country b)
{
return a.jiang_rat>b.jiang_rat;
}
int main()
{
int n,m;
while(cin>>n>>m)
{
int result[1000][3]={0};
//输入
for(int i=0;i<n;i++)
{
cin>>coun[i].jin ;
cin>>coun[i].yin;
cin>>coun[i].sum;
coun[i].id=i;
coun[i].flag=0;
coun[i].jiang=coun[i].jin+coun[i].yin;
coun[i].jin_rat =((float)coun[i].jin) /((float)coun[i].sum) ;
coun[i].jiang_rat =((float)coun[i].jiang)/((float)coun[i].sum) ;
}
for(int i=0;i<m;i++)
{
int temp=0;
cin>>temp;
coun[temp].flag=1;
}
//按金牌排序
int temp1=0;
sort (coun,coun+n,compare_1);
//记录排名
for (int i=0;i<n;i++)
{
if (i!=0)
{
if(coun[i].jin!=coun[i-1].jin)
temp1=i;
}
coun[i].pai[0]=temp1+1;
}
//奖牌排序
int temp2=0;
sort (coun,coun+n,compare_2);
for (int i=0;i<n;i++)
{
if (i!=0)
{
if(coun[i].jiang!=coun[i-1].jiang)
temp2=i;
}
coun[i].pai[1]=temp2+1;
}
//金牌比率
int temp3=0;
sort (coun,coun+n,compare_3);
for (int i=0;i<n;i++)
{
if (i!=0)
{
if(coun[i].jin_rat!=coun[i-1].jin_rat)
temp3=i;
}
coun[i].pai[2]=temp3+1;
}
//奖牌比率
int temp4=0;
sort (coun,coun+n,compare_4);
for (int i=0;i<n;i++)
{
if (i!=0)
{
if(coun[i].jiang_rat!=coun[i-1].jiang_rat)
temp4=i;
}
coun[i].pai[3]=temp4+1;
}
//选出最佳排名
for(int i=0;i<n;i++)
{
int temp5=n+1;
for(int j=0;j<4;j++)
{
if(coun[i].pai[j]<temp5)
{
temp5=coun[i].pai[j];
coun[i].way=j+1;
coun[i].paiming=temp5;
}
}
}
//输出需要排名的国家,首先重新标记
for(int i=0;i<n;i++)
{
if(coun[i].flag ==1)
{
result[coun[i].id][0]=coun[i].paiming;
result[coun[i].id][1]=coun[i].way;
result[coun[i].id][2]=1;
}
}
for(int i=0;i<n;i++)
if(result[coun[i].id][2]==1)
cout<<result[i][0]<<":"<<result[i][1]<<endl;
cout<<endl;
}
//system("pause");
return 0;
}
1387
用字符串函数 思路不难
记录
自己编译了好几次才过
主要是变量用混了,以后需要在草稿纸上写清变量等东西再编码
翻转这里
原先
string s10=s.substr(0,begin);
string s20=s.substr(begin,len);
string s30=s.substr(begin+len,s.size()-begin-len);
int len2=s20.size();
for(int j=0;j<(len2/2);j++)
{
char temp=s20[j];
s20[j]=s20[len2-j-1];
s20[len2-j-1]=temp;
}
// cout<<s20<<endl;
s=s10+s20+s30;
修改为
for(int i=begin;i<begin+len/2;i++)//翻转
{
char temp=s[i];
s[i]=s[len-1-i+2*begin];
s[len-1-i+2*begin]=temp;
}
查找类问题
用map 超级好用
1476 1477 例题
#include <iostream>
#include <string>
#include <string.h>
#include<algorithm>
#include <vector>
#include <map>
using namespace std;
struct node
{
string id;
string name;
string sex;
int age;
};
int main()
{
int n,q;
map<string ,node>M;
while(cin>>n)
{
for(int i=0;i<n;i++){
node temp;
cin>>temp.id >>temp.name>>temp.sex>>temp.age;
M[temp.id]=temp;
}
cin>>q;
for(int i=0;i<q;i++)
{
string flag;
cin>>flag;
if(M.find(flag)!=M.end())
cout<<M[flag].id <<" "<<M[flag].name<<" "<<M[flag].sex<<" "<<M[flag].age<<endl;
else
cout<<"No Answer!"<<endl;
}
}
//system("pause");
return 0;
}
1177
基础
#include <bits/stdc++.h>
using namespace std;
struct student
{
int id;
int book;
}a[300];
int main()
{
int n,q;
while(cin>>n>>q)
{
map<int ,int>M;
for(int i=0;i<n;i++)
{
a[i].id=i;
cin>>a[i].book;
M[a[i].book]++;
}
for(int i=0;i<n;i++)
{
if(M[a[i].book]==1)
cout<<"BeiJu"<<endl;
else
cout<<(M[a[i].book]-1)<<endl;
}
}
//system("pause");
return 0;
}
1388
连用MAP都不用,直接上数组
简单
1383
思路简单
记录:
大佬写法
其中的unique()去重
unique()–去重 (Ps:要先进行排序,保证重复元素相邻)
unique(A.begin(),A.end())
但是注意这里并没有删除元素,只是把元素移到了末尾
unique会把相邻重复元素全部丢到队列末尾,只留下一个在原队列
而且, unique() 的返回值就是被后置元素的“首地址”(迭代器)
记录2:
可用MAP去重
if(M[x]==0){
M[x]++;
f[count++]=x;
}
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
int n, m,temp;
vector<int> a;
cin >> n;
for (int i = 0;i < n;i++) {
cin >> temp;
a.push_back(temp);
}
cin >> m;
sort(a.begin(), a.end());
a.erase(unique(a.begin(), a.end()), a.end());
cout << a[m-1];
}
1478 喝饮料
注意的是数据定义为double这样方便
printf("%.3lf\n",cnt);
1307
简单
1347
先放着 难
链表
1081
循环链表的建立
#include<iostream>
#include<string>
#include<string.h>
#include<vector>
#include<stdio.h>
#include <queue>
#include <functional>
#include<algorithm>
using namespace std;
const int maxn=100+5;
int n,s,m;
struct node
{
int date;
node *next;
};
//创建循环链表
struct node* creat()
{
node *now ,*head,*pre;
for(int i=1;i<=n;i++)
{
now=new node;
if(i==1)
{
head=now;pre=now;
}
now->date =i;
now->next=head;
pre->next=now;
pre=now;
}
return head;
}
void prin(struct node *head)
{
struct node *pre,*p;
p=head;
while(s>1)
{
pre=p;
p=p->next;
s--;
}
int i=1;
while(p!=NULL)
{
if(p==p->next)
{
cout<<p->date<<endl;break;
}
if(i%m==0)
{
cout<<p->date<<",";
pre->next=p->next;
}
else
pre=p;
p=p->next;
i++;
}
}
int main()
{
while(cin>>n>>s>>m)
{
if(n+s+m==0)break;
struct node *head;
head=creat ();
prin(head);
}
return 0;
}
1015
创建链表后的排序
记录
之前一直跳出错误,主要是我头插法创建链表出错了
链表排序,直接交换数值即可
//头插法插入链表
for(int i=0;i<5;i++)
{
struct node *now=new node;
cin>>now->date ;
now->next=head->next;
head->next=now;
}
1018
和签到题创建循环链表思想一致
1025
合并链表
之前老是内存溢出,故合并两个链表 ,第三个用指针就好,不要另外开辟空间
//now=new node;
if( head1->date >head2->date )
{
//now->date=head2->date;
//tail->next=now;
//tail=now;
tail->next=head2;
tail=tail->next;
head2=head2->next;
}
后面老是时间溢出,因为这个链表应该判断等于的情况,不然是等于的话,会一直循环直到时间溢出
if( head1->date >=head2->date )
{
tail->next=head2;
tail=tail->next;
head2=head2->next;
}
1405
同1015
1533
#include<cstdio>
#include <vector>
#include <string>
#include <string.h>
#include<iostream>
#include <queue>
#include<algorithm>
using namespace std;
const int maxn=100+5;
struct node
{
int date;
struct node *next;
};
//尾插法建立链表
struct node * creat(int n)
{
struct node *head,*pre;
for(int i=0;i<n;i++)
{
struct node *now=new node;
if(i==0)
{
head=now;
pre=now;
}
cin>>now->date;
pre->next=now;
pre=now;
}
pre->next=NULL;
return head;
}
int main()
{
int n;
while(cin>>n)
{
struct node *head=creat(n);
struct node *temp=head;
while(temp->next)
{
int p=temp->date;
temp->date=temp->next->date;
temp->next->date=p;
if(temp->next==NULL||temp->next->next==NULL)
break;
else
temp=temp->next->next;
}
while(head)
{
cout<<head->date<<" ";
head=head->next;
}
cout<<endl;
}
}