- 一,说反话
今天遇到降维打击了,这道题我的思考方式停留在一维的字符串阶段,想通过空格的位置来分段,
再把这每一小段从后到前输入到一个新的一维的字符串,殊不知升维,可以用字符串数组定一变一的特性,
非常灵活的把句子逆化,而且复杂度可以接受,属于空间换时间的典范。主要的分知识点有:
1.判别空字符,它占一个字符长度
2.虽然是没运行出来,但总的来讲最大的收获就是不要命名想一出是一出,一会儿不看很容易断思路 //算是我编的至今最长的代码了
#include<stdio.h>
#include<string.h>
const int max=80;
int main(){
char str[max]; //空格和换行符 ' ' 和 \n
memset(str,0,sizeof(str));
int a[max];
a[max]={0};
gets(str);
int m=strlen(str);
int j=0;
for(int i=0;i<m;i++){ //把空格位置放到数组里
if(str[i]==' ') { // if 语句如果不打括号 只执行相邻一句
a[j]=i;
j++; //最大位置的空格在a[j]里
}
}
printf("%d",j) ;
char strnew[max];
memset(strnew,0,s
izeof(strnew));
int b=j; // 把总空格数数转变为a
printf("%d",b);
while(b<0){ //两个空格有三个片段
int w=1; //记录空格的次数
if(b==j){ //最后一段具有特殊性
for( ;a[j]<m;a[j]++,j++) { //把最后一个空格之后的给strnew
int n=0;
strnew[n++] = str[j+1];
}
strnew[b-j+w]={' '}; w++; //每个单词后加空格
}else {
for(;a[j-1]<a[j];a[j-1]++){
strnew[b-j+w]=str[a[j-1]+1];
w++;
}
strnew[b-j+w]={' '}; w++;
}
b--;
}
return 1;
}
3.if else之间的关系
他两执行是二选一,但如果配合循环while or for ,其实有一定关联,例如else的语句可以重置if中的变量
#include<stdio.h>
#include<string.h>
int main(){
char str[90];
gets(str);
int len=strlen(str),r,h=0;
char ans[90][90];
for(int i=0;i<len;i++){
if(str[i]!=' '){
ans[r][h++]=str[i];
}else{
ans[r][h]='\0';
r++;
h=0;
}
}
for(int i=r;i>=0;i--){
printf("%s",ans[i]); // printf虽说无法识别空格也能用for连成一句的样子
if(i>0) printf(" ");
}
return 1;
}
- 二,回文串
这题相对简单只要搞清楚数学原理,以及最简单的strlen函数就可以出来,具体收获有:
1.sizeof和strlen区别,一个只看分配的内存空间,一个只看字符所占空间
2.字符的相同也可以用== 号 ,这个疏忽了
#include<cstdio>
#include<cstring>
const int max=256;
int main(){
char str[max];
memset(str,0,sizeof(str));
gets(str);
int a=strlen(str); //sizeof 只能得到所分配的空间
// printf("%d",a);
int m=0;
for(int i=0;i<(a/2);i++){ //如何判断字符是一致的???
if(str[i]==str[a-i-1]) m++; // == 号可以直接判断
}
if(m==(a/2)) printf("YES");
else printf("NO") ;
return 1;
}