voidswap(char* a,char* b){char temp =*a;*a =*b,* b = temp;}char*reformatNumber(char* number){int cur =0, i =0;//cur指向待交换的位置,i指向遍历的位置while(number){//遍历numberwhile(number[i]&&number[i]>='0'&& number[i]<='9'){//当前位置是数字swap(number + cur, number + i);//把所有数字提前
cur++;//存数字的位置往后一位
i++;//看下一个位置}if(0== number[i]){break;}
i++;//看下一个位置}
number[cur]=0;//数字后,补一个结束符。int len =strlen(number);//数字个数//3种情况//1==len%3,if(4==len) 需要len/3 个 '-'//2==len%3 if(2==len) 需要len/3 个 '-'//0==len%3 需要len/3 - 1 个'-'int extra =(len -1)/3;//需要'-'的数量//这一行包含上面三种情况
cur =0;//cur指向number
i =0;//i指向anschar* ans =(char*)calloc(extra + len +1,sizeof(char));while(len){//看情况增加'-'if(len - cur >4){strncpy(ans + i, number + cur,3*sizeof(char));//有库函数,简单轮子拿来用
i +=3, cur +=3;
ans[i++]='-';//补一个'-'}else{//len-cur<=4if(1== len %3){//len-cur=4strncpy(ans + i, number + cur,2*sizeof(char));
i +=2;
ans[i++]='-';strncpy(ans + i, number + cur +2,2*sizeof(char));
i +=2;}elseif(2==len %3){//len-cur=2strncpy(ans + i, number + cur,2*sizeof(char));
i +=2;}else{//len - cur = 3strncpy(ans + i, number + cur,3*sizeof(char));
i +=3;}break;}}return ans;}
三、思路分析
重新格式化电话号码,主要考察字符串操作,内存空间的认知。
写一个
s
w
a
p
swap
swap函数,一次遍历
n
u
m
b
e
r
number
number,把所有数字放在
n
u
m
b
e
r
number
number最前面。
申请堆空间
a
n
s
ans
ans,用于保存答案。
再次遍历
n
u
m
b
e
r
number
number,将数字格式化,并保存在
a
n
s
ans
ans中。
四、代码分析
理解思路很重要!
细节看注释嗷。
博主欢迎读者在评论区留言,作为日更博主,看到就会回复的。
五、AC
六、复杂度分析
时间复杂度:
O
(
n
)
O(n)
O(n) ,
n
u
m
b
e
r
number
number数组的大小=
n
n
n。两次遍历
n
u
m
b
e
r
number
number的时间复杂度是
O
(
2
n
)
O(2n)
O(2n),即
O
(
n
)
O(n)
O(n)。
空间复杂度:
O
(
n
)
O(n)
O(n),申请了用于保存答案的
a
n
s
ans
ans,大小为
n
+
e
x
t
r
a
+
1
n+extra+1
n+extra+1,
e
x
t
r
a
extra
extra是格式化需要加入
′
−
′
'-'
′−′的数量,
a
n
s
ans
ans的空间复杂度是
O
(
n
)
O(n)
O(n)。