题目
思路1
暴力法:时空复杂度较高
-
定义一个辅助字符数组s3.
-
遍历字符数组s1,当数组中为字母时,赋值到辅助数组中;当数组中为数字时,将“number”赋值到辅助数组中。
#include<stdio.h>
#include<string.h>
int main(){
char s1[100],s2[8]="number",s3[200];
gets(s1);
int len1,len2,i,j,k=0;
len1=strlen(s1);
for(i=0; i<len1; i++){
if(s1[i]>='0'&&s1[i]<='9'){
for(j=0; j<6; j++)
s3[k++]=s2[j];
}else
s3[k++]=s1[i];
}
s3[k]='\0';
puts(s3);
return 0;
}
思路2
双指针法
-
首先统计s1数组中数字的个数。
-
给数组扩容,即计算出数字替换字母之后数组的长度。
-
遍历字符,从后往前遍历:i指针指向初始字符串,j指针指向新字符串;若是字母,则直接赋值;若是数字,则赋值字母(倒着赋值)。
#include<stdio.h>
#include<string.h>
int main(){
char s1[100],s2[7]="number";
int len1,i,j,cnt=0,k,len2;
gets(s1);
len1=strlen(s1);
for(i=0; i<len1; i++){
if(s1[i]>='0'&&s1[i]<='9')
cnt++;//统计数字个数
}
len2=len1+cnt*5;//给数组扩容
for(i=len1-1,j=len2-1; i>=0; i--){
if(s1[i]>='0' && s1[i]<='9'){
for(k=5; k>=0; k--)
s1[j--]=s2[k];
}else{
s1[j--]=s1[i];
}
}
s1[len2]='\0';
puts(s1);
return 0;
}