昨晚参加一个笔试,题目大致的意思是:给一个字符串将其中的'*'字符提到该字符串的前面,而且其他字符的相对顺序不会改变。要求效率尽可能高,临时存储空间尽可能少。
如:ab**cd**fef**gh12,调整后为:******abcdefgh12。
我的思路是:两个循环,外循环遍历整个字符串,到外循环遇到'*'时,内循环从外循环+1的位置开始,直至找到第一个非'*'字符,然后二者交换,内循环停止;等外循环遍历完整个字符串,结束。
自己写了一个,好烂!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void swap(char *a, char *b)
{
char tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
void stringReposition(char *str)
{
char *i, *j;
char *tmp;
int cnt = 0;
int len = strlen(str);
for(i = str; *i != '\0'; i++){
if(*i == '*'){
/* i='*', j为第一个非'*'的位置 */
for(j = i+1; *j == '*' && *j != '\0'; j++);
if(*j == '\0') {
//i j
//***** \0
//cnt为*的个数
cnt = j - i;
break;
}else if(*j != '*'){
swap(i, j);
}
}
}
/* 上面调整完后会是abcdefgh12******的情况,所以循环右移六个字符即可达到要求 */
tmp = (char*)malloc(sizeof(char)*cnt);
memcpy(tmp, str+len-cnt, cnt);
memcpy(str+cnt, str, len-cnt);
memcpy(str, tmp, cnt);
//return str;
//printf("%s\n", str);
}
int main()
{
char str[] = "*ab*cd**ef**gh12";
stringReposition(str);
printf("%s\n", str);
return 0;
}
|
这是人家高手写的代码,好简洁!
#include <stdio.h>
#include <string.h>
void stringAdjust(char *str)
{
char *p2, *p1;
p1 = str;
while(*p1++ != '\0'); /* p1指针指向字符串最后一个字符(空字符, '\0') */
for(p2 = --p1; p1 >= str; --p1){
if(*p1 != '*'){
*p2-- = *p1;
}
}
for(; p2 >=str; --p2){
*p2 = '*';
}
}
int main()
{
char p1[] = "**abcd****efg";
char p2[] = "abcd***efg***";
char p3[] = "***abcdefg***";
char p4[] = "abcd******efg";
stringAdjust(p1);
printf("%s\n", p1);
stringAdjust(p2);
printf("%s\n", p2);
stringAdjust(p3);
printf("%s\n", p3);
stringAdjust(p4);
printf("%s\n", p4);
return 0;
}
|
讨论帖见:
1.
2.
阅读(1382) | 评论(0) | 转发(1) |