BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #45614同步于 2010/11/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

【已解决】[笔试题求助]关于字符串的处理

michealyao
2010/11/4镜像同步12 回复
昨晚参加一个笔试,题目大致的意思是:给一个字符串将其中的'*'字符提到该字符串的前面,而且其他字符的相对顺序不会改变。要求效率尽可能高,临时存储空间尽可能少。 如:ab**cd**fef**gh12,调整后为:******abcdefgh12。 我的思路是:两个循环,外循环遍历整个字符串,到外循环遇到'*'时,内循环从外循环+1的位置开始,直至找到第一个非'*'字符,然后二者交换,内循环停止;等外循环遍历完整个字符串,结束。 ----------------------------------<分隔符>------------------------------------- #include<stdio.h> int main() { char str[] = "ab**cd**fef**gh12"; char *p1 = str, *p2 = str; while (*p1++ != '\0'); for (p2 = --p1; p1 >= str; --p1) { if (*p1 != '*') *p2-- = *p1; } for (; p2 >= str; *p2-- = '*'); puts(str); return 0; }
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
michealyao机器人#1 · 2010/11/4
自己写了一个,感觉好烂
michealyao机器人#2 · 2010/11/4
#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); } } } 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; }
wildpointer机器人#3 · 2010/11/4
#include <stdio.h> #include <string.h> void foo(char *str) { char *end = str + strlen(str) - 1;//指向最后一个字符 char *p = end; while(p>=str) { if(*p != '*')//是个字母 { *end = *p; p--; end--; } else// *p是个'*' { p--; } } p = str; //谢谢wssip指正,原来没这句。 while(p<=end) *p++ = '*'; } int main() { char p1[] = "**abcd****efg"; foo(p1); printf("%s\n", p1); char p2[] = "abcd***efg***"; foo(p2); printf("%s\n", p2); char p3[] = "***abcdefg***"; foo(p3); printf("%s\n", p3); char p4[] = "abcd******efg"; foo(p4); printf("%s\n", p4); return 0; } 【 在 michealyao (吾爱雨寒) 的大作中提到: 】 : 昨晚参加一个笔试,题目大致的意思是:给一个字符串将其中的'*'字符提到该字符串的前面,而且其他字符的相对顺序不会改变。要求效率尽可能高,临时存储空间尽可能少。 : 如:ab**cd**fef**gh12,调整后为:******abcdefgh12。 : 我的思路是:两个循环,外循环遍历整个字符串,到外循环遇到'*'时,内循环从外循环+1的位置开始,直至找到第一个非'*'字符,然后二者交换,内循环停止;等外循环遍历完整个字符串,结束。 : ...................
laksjd88机器人#4 · 2010/11/4
【 在 michealyao 的大作中提到: 】 : #include <stdio.h> : #include <stdlib.h> : #include <string.h> : ................... 如果字符串里除了“*”,其他元素都不一样的话,你可以考虑考虑用sort,unique还有stable_sort算法。 我也初学C++,呵呵。
wildpointer机器人#5 · 2010/11/4
确实,thx 【 在 wssip (小笨) 的大作中提到: 】 : 楼上代码有个小错误,*p++应该为:*++p
wssip机器人#6 · 2010/11/4
试验了一下,还是有点问题,++完之后,首字母被‘*’替代了,这样才OK了! while(++p <= end){ ... *p = '*';...}
michealyao机器人#7 · 2010/11/4
【 在 wildpointer 的大作中提到: 】 : #include <stdio.h> : #include <string.h> : void foo(char *str) : ................... 赞!这个是CSDN上一哥们写的,思路跟你是一样的。简洁版。多谢啊 #include<stdio.h> int main() { char str[] = "ab**cd**fef**gh12"; char *p1 = str, *p2 = str; while (*p1++ != '\0'); for (p2 = --p1; p1 >= str; --p1) { if (*p1 != '*') *p2-- = *p1; } for (; p2 >= str; *p2-- = '*'); puts(str); return 0; }
michealyao机器人#8 · 2010/11/4
【 在 wssip 的大作中提到: 】 : 试验了一下,还是有点问题,++完之后,首字母被‘*’替代了,这样才OK了! while(++p <= end){ ... *p = '*';...} : -- 多谢
wildpointer机器人#9 · 2010/11/4
int main() { char p1[] = "**abcd****efg"; foo(p1); printf("%s\n", p1); char p2[] = "abcd***efg***"; foo(p2); printf("%s\n", p2); char p3[] = "***abcdefg***"; foo(p3); printf("%s\n", p3); char p4[] = "abcd******efg"; foo(p4); printf("%s\n", p4); char p5[] = "abcdefg******"; foo(p5); printf("%s\n", p5); char p6[] = "abcdef"; foo(p6); printf("%s\n", p6); char p7[] = "*************"; foo(p7); printf("%s\n", p7); return 0; } 我用上面的例子测过,没问题。 你指的问题是不加p=str;这一句吗? 【 在 wssip (小笨) 的大作中提到: 】 : 试验了一下,还是有点问题,++完之后,首字母被‘*’替代了,这样才OK了! while(++p <= end){ ... *p = '*';...}