3.6 字符串处理
要分析题目的输入和输出格式,注意很多细节和边界情况。这个题型十分常见,也能很好体现代码能力。
题目描述:
读入一串字符,判断是否是“回文串”。“回文串”是一个正读和反读都一样的字符串,比如“level”或者“noon”就是回文串。
输入格式:
一行字符串,长度不超过255。
输出格式:
如果是“回文串”,输出“YES”,否则输出“NO”。
样例输入:
12321
样例输出:
YES
思路:
由于回文串正读和反读都是一样的,我们只需要遍历字符串的前一半,当字符数组中有一个字符与其对称字符不相同,即存在str[i]!=str[len-1-i]
(len为字符串的长度,i从0开始要小于len/2而不能取到),就说明这个字符串不是“回文串”,否则是“回文串”。
参考代码:
#include <cstdio>
#include <cstring>
// 判断字符串str是否是回文串
bool judge(char str[]){
// 存储字符串的长度
int len = strlen(str);
// 遍历字符串的前一半,
for(int i=0; i<len/2; i++){
// 只要有str[i]与其对称位置的str[len-1-i]的字符不相同,
if(str[i] != str[len-1-i]){
// 则字符串不是回文串
return false;
}
}
// 否则是回文串
return true;
}
int main(){
// str字符数组存储输入的字符串
// 规定长度不超过255,保险点,定义长一些
char str[265];
// scanf("%s", str);
// 多点预测,使用while读到文件末尾
while(scanf("%s", str) != EOF){
// 判断字符串是不是回文串
bool tag = judge(str);
// 是则输出“YES”,不是输出“NO”
if(tag == true){
printf("YES\n");
}else{
printf("NO\n");
}
}
return 0;
}
题目描述:
给定一句英语,要求编写程序,将句中所有单词按颠倒顺序输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用一个空格分开,输入保证句子末尾没有多余的空格。
输出格式:
每个测试用例的输出占一行,输出倒序后的句子。
样例输入:
Hello World Here I Come
样例输出:
Come I Here World Hello
思路:
使用二维数组,每一行存储一个单词,最后从后往前输出每一个单词。先用一个字符数组存储输入的字符串,然后按空格分隔每一个单词存储到二维数组中。
参考代码:
#include <cstdio>
#include <cstring>
int main(){
// char str[90][90];
// int num=0;
// // 使用这个形式需自己在终端使用Ctrl+z再回车
// while(scanf("%s", str[num]) != EOF){
// num++;
// }
// for(int i=num-1; i>=0; i--){
// printf("%s", str[i]);
// if(i != 0){
// printf(" ");
// }
// }
// str字符数组用来存储输入字符串
// ans使用二维数组,每一行存储一个单词
char str[90], ans[90][90];
// gets读取一行字符串
gets(str);
// 记录这行字符串的长度
int len = strlen(str);
// low记录二维数组的行数,col为列数
int low=0, col=0;
// 使用循环将每个单词按顺序存储到二维数组中
for(int i=0; i<len; i++){
// 当字符不是空格时,将其存储到二维数组
if(str[i] != ' '){
ans[low][col++] = str[i];
}else{
// 当字符为空格,我们在二维数组的一行最后加入终止符
ans[low][col] = '\0';
// 然后二维数组移到下一行
low++;
// 列数重置为0
col = 0;
}
}
// 使用循环从最后一行开始,从后往前输出单词
for(int i=low; i>=0; i--){
printf("%s", ans[i]);
// 除了最后一个单词后面没有空格,其余单词之间都要添加空格
if(i > 0){
printf(" ");
}
}
return 0;
}