题解 | #字符串变形#
字符串变形
https://www.nowcoder.com/practice/c3120c1c1bc44ad986259c0cf0f0b80e
/**
*
* @param s string字符串
* @param n int整型
* @return string字符串
*/
#include <stdlib.h>
#include <string.h>
char* trans(char* s, int n ) {
int i,j,k=n-1,l=0;
char *str=(char*)malloc(sizeof(char)*(n+1)); //分配内存以免函数结束后新字符串被清空
for (i=n-1;i>=0;i--){ //从后往前遍历
if (s[n-1]==' '&&i==n-1) str[l++]=' ';
if (s[i]==' ') { //发现空格
for (j=i+1;j<=k;j++){ //打印空格后单词
if (s[j]>='A'&&s[j]<='Z') str[l++]=s[j]+32;
else if (s[j]>='a'&&s[j]<='z') str[l++]=s[j]-32;
else str[l++]=' ';
}
if (s[k]!=' ') str[l++]=' '; //原字符串最后一个单词(新字符串第一个单词)后加上空格
k=i; //将当前i的值赋予k作为下一次循环中的截止条件
}
if (i==0) {
if (k==n-1) { //假如一共只有一个单词
for (j=i;j<=n+1;j++){
if (s[j]>='A'&&s[j]<='Z') str[l++]=s[j]+32;
else if (s[j]>='a'&&s[j]<='z') str[l++]=s[j]-32;
}
}
//打印原字符串第一个单词
else for (j=i;j<k;j++){
if (s[j]>='A'&&s[j]<='Z') str[l++]=s[j]+32;
else if (s[j]>='a'&&s[j]<='z') str[l++]=s[j]-32;
}
}
}
str[l]='\0';
return str;
}
这是初步的解法,其实还可以优化,比如把识别是否为一个单词的部分和打印一个单词的部分封装成单独的函数,以减少重复的代码。


