东方博宜OJ 字符串 — 2.字符串基础【题解】1093~1134

1093. 打印小写字母表

问题描述

把英文字母表的小写字母按顺序和倒序打印出来。(每行 13 个)

输入:

输出四行:

abcdefghijklm
nopqrstuvwxyz
zyxwvutsrqpon
mlkjihgfedcba
#include<bits/stdc++.h>
using namespace std;
int main()
{
    char a;
    for(int i='a';i<='z';i++)
    {
        printf("%c",i);
        if(i=='m'||i=='z')
            printf("\n");
    }
    for(int i='z';i>='a';i--)
    {
        printf("%c",i);
        if(i=='n'||i=='a')
            printf("\n");
    }
    
    return 0;
}

1101. 时间的差

问题描述

看到两个标准格式的时间,有小时,有分钟,有秒,格式如:ℎ:𝑚:𝑠h:m:s,即 时 : 分 : 秒。

你想知道,这两个时间之间相差多少吗?

输入

输入包括两行,两行均为一个“时 : 分 : 秒”格式的时间。

且本题保证第一个时间一定大于第二个时间!

输出

输出就是输入的两个时间之间的秒数差。

样例

输入

复制

01:10:10
00:30:30
输出

复制

2380

#include<bits/stdc++.h>
using namespace std;
int main(){
	string a,b;
	int c,d;
	cin >> a >> b;
	c = (a[0] * 10 + a[1]) * 3600 + (a[3] * 10 + a[4]) * 60 + a[6] * 10 + a[7];
	d = (b[0] * 10 + b[1]) * 3600 + (b[3] * 10 + b[4]) * 60 + b[6] * 10 + b[7];
	cout << c - d;
}

1134. 国王的魔镜(五种解法)

问题描述

国王有一个魔镜,可以把任何接触镜面的东西变成原来的两倍——只是,因为是镜子嘛,增加的那部分是反的。

比如一条项链,我们用 𝐴𝐵AB 来表示,不同的字母表示不同颜色的珍珠。如果把 𝐵B 端接触镜面的话,魔镜会把这条项链变为 𝐴𝐵𝐵𝐴ABBA 。如果再用一端接触的话,则会变成 𝐴𝐵𝐵𝐴𝐴𝐵𝐵𝐴ABBAABBA (假定国王只用项链的某一端接触魔镜)。

给定最终的项链,请编写程序输出国王没使用魔镜之前,最初的项链可能的最小长度。

输入

只有一个字符串(长度 ≤100≤100),由大写英文字母组成,表示最终的项链。

输出

只有一个整数,表示国王没使用魔镜前,最初的项链可能的最小长度。

样例

输入

复制

ABBAABBA
输出

复制

2

#1 解法


include<bits/stdc++.h>
using namespace std; 
bool huiwen(char s[ ])
 {

    bool F;
    int len=strlen(s);
    F=true;
    for(int i=0;i<len/2;i++)
    {
	    if(s[i]!=s[len-i-1])
	    F=false;
    }

    return F;

} 

int main() {

char s[110];
cin>>s;	
while(strlen(s)%2==0&&huiwen(s)==1)
s[strlen(s)/2]='\0';
 cout<<strlen(s);
return 0;
}


#2解法:桶思维

//#2- 利用桶思维

#include<bits/stdc++.h>
using namespace std;
int tong[91];
int main()
{
	int cnt = 0;
	string s;
	cin >> s;
	for(int i = 0; i < s.size(); i++)
    {
		tong[s[i]]++;
	}
	
	for(int i = 65; i <= 90; i++)
    {
		if(tong[i] > 0)
        {
			cnt++;
		}
	}
	
	cout << cnt;
	return 0;
}

#3解法:


#include<bits/stdc++.h>
using namespace std;
int main()
{
	string a;
	cin>>a;
	while(1)
        {
		    if(a.size()%2!=0)
            {
			    break;
		    } 
		    
            string b=a;
	  	    reverse(b.begin(),b.end());   //reverse()  反转字符串函数 
	  	    if(a!=b)
                {
	  		        break;	
		        }
	  	    
            a=a.substr(0,a.size()/2);    //.substr(0,n)  获取从0到n的长度 
	    }
	
    cout<<a.size();
	return 0;
}


#4解法:


#include <bits/stdc++.h>
using namespace std;
string fun1(string s);

string fun1(string s) 
{
	string b;
	for (int i = s.size() - 1;i >= 0;i--) 
    {
		b.push_back(s[i]);
	}
	return b;
}

int main() 
{
	string s;
	getline(cin,s);
	while (s == fun1(s))
    {
		s = s.erase(s.size() / 2,s.size() / 2);
	}
	cout << s.size();
}

#5解法:


#include<bits/stdc++.h>
using namespace std;
int main() 
{
	string s;
	string ts,ts1,ts2;
	cin >> s;
	int t = 0;

	ts = s.substr(s.size() / 2,s.size() / 2);

	for (int i = ts.size() - 1;i >= 0;i--)
    {
	    ts1.push_back(ts[i]);
	}

	s = s.substr(0,s.size() / 2);

	//cout << s << endl;

	while (s == ts1) 
    {
		t += 1;
		ts = s.substr(s.size() / 2,s.size() / 2);
		//cout << ts;
		
        ts1.clear();
		
        for (int i = ts.size() - 1;i >= 0;i--) 
        {
			ts1.push_back(ts[i]);
		}
		ts2 = s;
		
        s = s.substr(0,s.size() / 2);
	}

	//cout << ts2 << endl;
	cout << ts2.size();
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值