返回信息流昨晚参加一个笔试,题目大致的意思是:给一个字符串将其中的'*'字符提到该字符串的前面,而且其他字符的相对顺序不会改变。要求效率尽可能高,临时存储空间尽可能少。
如: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;
}
这是一条镜像帖。来源:北邮人论坛 / cpp / #45614同步于 2010/11/4
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
【已解决】[笔试题求助]关于字符串的处理
michealyao
2010/11/4镜像同步12 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
#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;
}
#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的位置开始,直至找到第一个非'*'字符,然后二者交换,内循环停止;等外循环遍历完整个字符串,结束。
: ...................
【 在 michealyao 的大作中提到: 】
: #include <stdio.h>
: #include <stdlib.h>
: #include <string.h>
: ...................
如果字符串里除了“*”,其他元素都不一样的话,你可以考虑考虑用sort,unique还有stable_sort算法。
我也初学C++,呵呵。
【 在 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;
}
【 在 wssip 的大作中提到: 】
: 试验了一下,还是有点问题,++完之后,首字母被‘*’替代了,这样才OK了! 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);
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 = '*';...}