请教一道机试题(HW):统计字符串中相同字符重复出现的次数

wangdan1600 2012-04-05 09:56:58
上月底去HW应聘,遇到一道机试题,没做对。当时我看单步调试的结果,像是对的,但最终输出结果还是不对。
贴出来给大家看看。
题目的大意应该是对的,实际的main函数是隐藏的。


/*
* 给定一个字符串,实现一个函数,按下述方式输出字符串:
* 如果此字符的下一个字符和此字符不一样,原样输出此字符,
* 否则先输出此字符,再输出此字符连续出现的次数(次数不大于9)。
* 例如,字符串ABBCCCDEDFFF,输出的结果为AB2C3DEDF3。
*
* 不用考虑溢出问题,不能使用任何I/O函数
*/

void change_str(char *s, int len)
{
char tmp[1024]='\0';
int i = 0, j = 0;

for (i = 0; i < len; i++)
{

}
}

int main(int argc, char **argv)
{
char str[1024] = "ABBCCCDEDFFF";

change_str(str, 1024);

printf("changed string is %s\n", str);
//expect result: AB2C3DEDF3
return 0;
}


...全文
512 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
反方向 2012-04-12
  • 打赏
  • 举报
回复
指针不会用,搞了个数组,也没复制,但是没按要求办事,用了I/O函数了,反正只是为了测试了一下,按照wangdan1600的意思输出了F9F3



#include<iostream>
using namespace std;

int main()
{
string s;
int a[30];

while(cin>>s)
{
for(int i=0; i<30; i++)
a[i]=1;
int len=s.length();
int k=0;
for(int i=1; i<=len; i++)
{
if(s[i]==s[i-1])
{
a[k]++;
}
else
{
if(a[k]==1)
cout<<s[i-1];
if(a[k]!=1&&a[k]<=9)
{
cout<<s[i-1];
cout<<a[k];
}

if(a[k]!=1&&a[k]>9)
{
for(int pp=0;pp<a[k]/9;pp++)
cout<<s[i-1]<<9;
cout<<s[i-1]<<a[k]%9;
}
k++;
}
}
cout<<endl;
}
}
pengfoo 2012-04-06
  • 打赏
  • 举报
回复
我也写了个。花了点时间,看来c指针这块我还没有驾驭啊!贴下代码,与大家交流交流。可是我写的有个缺点,就是void change_str(char *s, int len)
这里的形参 int len没用上。

#include <stdio.h>
#include <string.h>

void change_str(char *s, int len)
{
char *s1 = s;
char *p=s;
char tmp[1024]={0};
char *p_tmp=tmp;
int cnt ;
/*printf("s is %s\n", s);*/
*p_tmp = *s;
while(*++p)
{
if(*p == *s1++)
{
cnt++;
*p_tmp = cnt+'0';
continue;
}
if(cnt == 1)
*p_tmp++ = *p;
else
{
p_tmp++;
*p_tmp++ = *p;
cnt = 1;
}

}
*++p_tmp = '\0';
printf("tmp[] is %s\n", tmp);
strcpy(s,tmp);
}

int main(/*int argc, char **argv*/)
{
char str[1024] = "ABBCCCDEDFFF";
change_str(str, 1024);
printf("changed string is %s\n", str);
//expected result: AB2C3DEDF3
system("pause");
return 0;
}


pengfoo 2012-04-06
  • 打赏
  • 举报
回复
to bearzyjbearzyj:
你的方法是正确的,但是未注意到一个限定条件:连续出现的次数不大于9.
也即,如果遇到像这样的字符串ABBCCCDEDFFFFFFFFFFFF,其正确的输出是AB2C3DEDF9F3,而不
是:AB2C3DEDF<

**********************************
题意有说ABBCCCDEDFFFFFFFFFFFF,其正确的输出是AB2C3DEDF9F3吗??
连续出现的次数不大于9 理解应该是对测试用例的限定吧!根据这个限定,ABBCCCDEDFFFFFFFFFFFF是不合法的。题意不是说当你遇到了ABBCCCDEDFFFFFFFFFFFF要把它输出成AB2C3DEDF9F3。。而是这种不合法的情况是不存在的。
wangdan1600 2012-04-06
  • 打赏
  • 举报
回复
sorry,昨晚后来有事,就没上来。
我基本上知道自己错在哪儿了,用了临时数组,但是没有strcpy,也没有像cattycat那样用指针。。
谢谢大家的回复。

to flowingfirefly:
看上去是不严谨,原题并未说明字符串内容是什么样的。既然要用printf输出,那么假定都是可打印字符也应该是可行的。

to hen_hao_ji:
原题只给了一个change_str空函数。我帖子里多写了几句,可能误导了你,不好意思。
你给出的答案,会将未连续出现的字符也进行次数统计,和题意稍微不符。
changed string is A1B2C3D1E1D1F3

to bearzyjbearzyj:
你的方法是正确的,但是未注意到一个限定条件:连续出现的次数不大于9.
也即,如果遇到像这样的字符串ABBCCCDEDFFFFFFFFFFFF,其正确的输出是AB2C3DEDF9F3,而不
是:AB2C3DEDF<

to cattycat:
这个方法技巧性很好了,而且也没使用库函数。原题实际上是没有包含<stdio.h>和<string.h>的。

HW的机试题,是自动评分的,后台有对应的测试用例。大家都未注意到连续出现的次数不大于9这个条件,因此都没法得满分,呵呵。
bearzyj2011 2012-04-05
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

根据代码来看,应该是不能申请其它变量了吧。。
[/Quote]

嗯,你说的也有可能,看了下你的代码,很神奇,稍微有点小瑕疵,就是数字1也会打出来。总的来说,挺赞的~

还有,用你的代码在VC6下单步的时候,发现个有趣的现象,如果你知道原因,也请帮忙看看哦
http://topic.csdn.net/u/20120405/22/59e70f6b-ad8c-44f5-8c26-e0ec9f005d50.html
hen_hao_ji 2012-04-05
  • 打赏
  • 举报
回复
根据代码来看,应该是不能申请其它变量了吧。。
cattycat 2012-04-05
  • 打赏
  • 举报
回复
不用临时数组和strcpy的。
void change_str(char *s, int len)
{
char *p, *q, *t;
int cnt=0;
for(q=s,p=s+1,t=q;*p;p++)
{
if(*p!=*q)
{
*t++=*q;
if(cnt>=2)
{
*t++='0'+cnt;
}
q=p;
cnt=0;
}
else
{
if(cnt == 0)
cnt=2;
else
cnt++;
}
}
//最后一个字符
*t++=*q;
if(cnt>=2)
*t++='0'+cnt;
*t='\0';

}
bearzyj2011 2012-04-05
  • 打赏
  • 举报
回复
VC6 测试OK,如下:


#include "stdio.h"
#include "string.h"

void change_str(char * const s, int len)
{
char tmp[1024]="\0";
int i=0;

char *pch1=s;
char *pch2;


for (pch2=pch1+1;(pch2-s)< len-1; pch2 ++)
{
if(*pch2!=*pch1)
{
tmp[i++]=*pch1;
if((pch2-pch1)>1)
{
tmp[i++]=pch2-pch1+'0';
}
pch1=pch2;
}
}
strcpy(s,tmp);
}


int main()
{
char str[1024] = "ABBCCCDEDFFF";

change_str(str, 1024);

printf("changed string is %s\n", str);
//expect result: AB2C3DEDF3
return 0;
}
pengfoo 2012-04-05
  • 打赏
  • 举报
回复
mark。。明天再学习。。
hen_hao_ji 2012-04-05
  • 打赏
  • 举报
回复

#include<iostream>
using namespace std;
void change_str(char *s, int len)
{
char tmp[1024] = {0};
int i = 0, j = 0;

tmp[j++] = s[i];

for (i = 0; i < len; i++)
{
if(i + 1 < len && s[i] != s[i+1])
{
tmp[j++] = tmp[j] + '1';
tmp[j++] = s[i+1];
}
else
{
++tmp[j];
}


}
strcpy(s, tmp);
}

int main(int argc, char **argv)
{
char str[1024] = "ABBCCCDEDFFF";

change_str(str, 1024);

printf("changed string is %s\n", str);
//expect result: AB2C3DEDF3
return 0;
}



flowingfirefly 2012-04-05
  • 打赏
  • 举报
回复
这个题目貌似不严谨, 没有说明原始字符串中是否含有数字字符, 例如, 原始字符串为 "2311155", 这样的话, change后 为 231352, 显得很混乱, 无法分辨。
flowingfirefly 2012-04-05
  • 打赏
  • 举报
回复
这个题很有意思, 先标记下。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧