05 替换数字

27 阅读1分钟

题目

image.png

思路1

暴力法:时空复杂度较高

  1. 定义一个辅助字符数组s3.

  2. 遍历字符数组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

双指针法

  1. 首先统计s1数组中数字的个数。

  2. 给数组扩容,即计算出数字替换字母之后数组的长度。

  3. 遍历字符,从后往前遍历: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;
}