字符串入门

P1308 统计单词数
这是我的学完stl后觉得异常轻松一道题目
记录几个好用的东西
1.getline 可以接受一整行字符串
2.a[i]=tolower(a[i])全部转换为小写
toupper
3.为了防止部分满足 a=" “+a+” " ,b也一样
4.b.find(a)==string::npos
5.设置两个一个存开头,一个存数字

#include <iostream>
#include <string>
//命名空间
using namespace std;
int main(){
    //定义两个字符串
    string a;
    string b;
    //用string库,调用getline, 直接读入一整行
    getline(cin,a);
    getline(cin,b);
    //转换大小写,可以都转换为大写,或者小写
    for (int i=0;i<a.length();++i){
        a[i]=tolower(a[i]);
    }
    for (int i=0;i<b.length();++i){
        b[i]=tolower(b[i]);
    }
    //因为连起来的不算,所以要在前后加几个空格,一定要是同样多的,同量减同量,等于同量
    a=' '+a+' ';
    b=' '+b+' ';
    //先看看会不会找不到,用a.find()和string::npos
    if (b.find(a)==string::npos){
        cout<<-1<<endl;
    }
    //如果找得到
    else {
        int alpha=b.find(a);
        int beta=b.find(a),s=0;//计数器初始化为0
        while (beta!=string::npos){
            ++s;//计数器
            beta=b.find(a,beta+1);
        }
        cout<<s<<" "<<alpha<<endl;//输出第一个和总共有几个
    }
    //函数返回值为0,结束整个程序
    return 0;
}

P3741 honoka的键盘
1.本身就存在的++,然后把它们干掉,他们没有用了
2.没被干掉的,且存在后面一个与自己相同的就可以+1

P1321单词覆盖和还原
1.这是两个没有重复字母的单词,所以一旦出现了就有了
2.但是如果只看这个,很可能会多算,如何避免,把三个和四个当成一个容器来看,所以其实就是找一个字母的个数,每动一次,只要匹配上一个就ok(这个思想好高级)

#include <bits/stdc++.h>
using namespace std;
int main()
{   int boy=0,girl=0;
	string s;
	cin>>s; 
	for(int i=0;i<s.length();i++)
	 {if((s[i]=='b')||(s[i+1]=='o')||(s[i+2]=='y'))
	boy++;
	 }
	 for(int i=0;i<s.length();i++)
	 {if((s[i]=='g')||(s[i+1]=='i')||(s[i+2]=='r')||(s[i+3]=='l'))
	 girl++;
	 }
	 cout<<boy<<endl<<girl;
	 return 0;
	
 } 

P1597 语句解析
1.map能用字符直接作为下标 map<char,int>num 表示以char为下标,存储的是int
2.注意初始化
3.判断第三位是不是数字,是的话,直接用map赋值
4.输出

 #include<iostream>
    #include<map>
    #include<cstdio>
    using namespace std;
    map <char,int> num;//字母是关键字,与赋值是一一映射关系
    string st;
    int main(){
        cin>>st;
        int len=st.length();
        num['a']=num['b']=num['c']='0';
        for(int i=0;i<len;i+=5)
          if(st[i+3]>='0'&&st[i+3]<='9')
            num[st[i]]=st[i+3];
           else num[st[i]]=num[st[i+3]];
        printf("%c %c %c",num['a'],num['b'],num['c']);
        
        return 0;
    }

利用switch+break

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

int n[3]; //n[2]代表a,n[1]代表b,n[0]代表c

int main(){
	string s;
	cin >> s;
	int slen=s.size();
	for (int i=0;i<slen;i++){
		int which=0; //用来记录左边是哪个变量
		switch (s[i]){ //利用不加break的语言特性
			case 'a':
				which++;
			case 'b':
				which++;
		}
		i+=3; //跳过:=
		if (s[i]>='0' && s[i]<='9') //判断右边是数字还是变量
			n[which]=s[i]-'0'; //赋值
		else{
			int which2=0; //用来记录右边是哪个变量
			switch (s[i]){ //利用不加break的语言特性
				case 'a':
					which2++;
				case 'b':
					which2++;
			}
			n[which]=n[which2]; //赋值
		}
		i++; //跳过;
	}
	for (int i=2;i>=0;i--){
		cout << n[i] << ' ';
	}
	cout << endl;
	return 0;
}

说实话没看太懂

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值