| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 3307 人关注过本帖
标题:[讨论]挑战!今天一家牛公司给的c语言面试题!!(限时一下午)
只看楼主 加入收藏
wuwei168668
Rank: 1
等 级:新手上路
帖 子:154
专家分:0
注 册:2007-3-11
收藏
得分:0 
题目我都搞不懂……

学C语言难得过老外学用中国的筷子吗?
2007-04-26 19:46
fengyunwu
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-4-26
收藏
得分:0 
以下是引用nuciewth在2007-4-24 23:34:09的发言:
1.

void Press(char *str)
{
int count=1;
int i=0,j=0,k=0,m=0;
char data[100];
int b[10];
while(str[i]!='\0')
{
count=1;
j=i+1;
while(str[j]!='\0'&&str[i]==str[j])
{
j++;
count++;
}
data[k++]=str[i];
m=0;
while(count) //将个数转换为字符
{
b[m++]=count%10;
count/=10;
}
while(m--)
{
data[k++]=b[m]+'0';
}
i=j;
}
data[k]='\0';
printf("\n%s\n%s\n",str,data);
}

感觉空间浪费的太大了,本来想直接移来着,不过想想时间效率不高,也很麻烦.所以就将就一下了
我觉得可以将上述程序修改以下可以避免a1bc1d1的问题。将数字不要转换成字符,直接以整形输出。并且将个数判别一下,为1则不输出。可以这样考虑,程序由while()循环构成,每经过一次循环,就输出一个字符及它的个数,这样就进行了压缩。程序如下:
void Press(char *str)
{
int count=1;
int i=0,j=0;
char data;
int b;
while(str[i]!='\0')
{
count=1;
j=i+1;
while(str[j]!='\0'&&str[i]==str[j])
{
j++;
count++;
}
i=j;
}
printf("%s",str[i]);
if(count!==1)
printf("%d",count);

}
2007-04-27 12:04
fengyunwu
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-4-26
收藏
得分:0 
回复:(philo)[讨论]挑战!今天一家牛公司给的c语言...

上面的子程序有些小错误。下面的这个程序是经我调试过的,可以得到正确的结果。我考虑的只是压缩,把压缩输出来。并不把压缩后的结果保存到数组里面。不知题中是否要求保存结果到数组。程序如下:
#include<stdio.h>
main()
{char str[5]={'a','a','c','d','\0'};
int count=1;
int i=0,j=0;
char data;
int b;
while(str[i]!='\0')
{
count=1;
j=i+1;
while(str[j]!='\0'&&str[i]==str[j])
{
j++;
count++;
}

printf("%c",str[i]);
i=j;
if(count!=1)
printf("%d",count);

}

// Press(str);

}

输出结果为a2cd,符合题目要求。

2007-04-27 13:27
philo
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-4-24
收藏
得分:0 

[QUOTE]上面的子程序有些小错误。下面的这个程序是经我调试过的,可以得到正确的结果。我考虑的只是压缩,把压缩输出来。并不把压缩后的结果保存到数组里面。不知题中是否要求保存结果到数组。程序如下:
#include<stdio.h>
main()
{char str[5]={'a','a','c','d','\0'};
int count=1;
int i=0,j=0;
char data;
int b;
while(str[i]!='\0')
{
count=1;
j=i+1;
while(str[j]!='\0'&&str[i]==str[j])
{
j++;
count++;
}

printf("%c",str[i]);
i=j;
if(count!=1)
printf("%d",count);

}

// Press(str);

}


输出结果为a2cd,符合题目要求。
[/QUOTE]
我拿什么来解压啊?

2007-04-27 16:37
hackerjiang
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:地球
等 级:版主
威 望:3
帖 子:780
专家分:111
注 册:2007-4-27
收藏
得分:0 
[CODE]还是斑竹强!
斑竹就是斑竹!厉害!
看不懂~~~~~~~~~~~~~~倒~~~~~~~~~~

(づ ̄ 3 ̄)づ
2007-04-27 16:38
fengyunwu
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2007-4-26
收藏
得分:0 

如果是解压的话,要另外编程来实现解压。首先把字符和数字分开来。我前面的程序没有考虑到解压,如果要解压的话必须把字符和数字分别存到两个不同的数组里面,以备调用。可另外编程实现。

2007-04-27 17:30
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
收藏
得分:0 

/*
字符串压缩
------------------------------------------------------
src是待压缩的源字符串
压缩的结果由 dest 带回(dest 的内存空间需要由外部声明)
*/
void Compress(unsigned char* src, char* dest)
{
/*使用 s/d 的原因是函数调用完成后不至于修改了它们的值,因为它们是指针*/
char* s = src;
char* d = dest;

int T = 1; /* T 是重复字符的记数器 */

*d = *s; /* 初始化第一个字符 */
s++; /* 源字符串指针移一个字符,程序后面附带一个图可说明为什么先移动一位,我就不多说了 */
while (*s)
{
if (*d == *s) /*若相等*/
{
sprintf(d+1, "%d", ++T); /* 写入到数组流(字节序列) */
}
else
{
d += 2; /*遇到不相等的字符*/
*d = *s; /* 写入数组流的当前位置 */
T = 1; /* 重置记数器(为下一个有重复的字符串服务) */
}
s++; /*源字符串向后移动 */
}
}


欢迎加入 MVC 技术讨论群(新群:90093426)
2007-04-27 22:48
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
收藏
得分:0 
时间不多,没时间弄了,
程序谁测试一下,不保证行。

欢迎加入 MVC 技术讨论群(新群:90093426)
2007-04-27 22:56
ded
Rank: 1
等 级:新手上路
帖 子:21
专家分:0
注 册:2007-2-28
收藏
得分:0 
LS的习惯不错,PF
2007-04-28 13:01
ChenMo
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:3
帖 子:481
专家分:10
注 册:2004-4-8
收藏
得分:0 

上面那个不大行,只有这样形式的字符串才可以:aaaabbbbccdddd
下面这个是经过修改并测试的程序。

/*
字符串压缩
------------------------------------------------------
src是待压缩的源字符串
压缩的结果由 dest 带回(dest 的内存空间需要由外部声明)
*/
void Compress(unsigned char* src, char* dest)
{
/* 使用 s/d 的原因是函数调用完成后不至于修改了它们的值,因为它们是指针 */
char* s = src;
char* d = dest;

int T = 1; /* T 是重复字符的记数器 */
int Flag = 0; /* 标记临近是否存在重复的字符 */

*d = *s; /* 初始化 dest 的第一个字符 */
/* 补充 dest 为合法字符串,这是防止源字符串只有一个字符时(不进入循环)目的字符串能正确输出 */
*(d+1) = '\0';
while (*(++s))
{
if (*d == *s) /*若相等*/
{
sprintf(d+1, "%d", ++T); /* 写入到数组流(字节序列),位置是下一个字符的位置。 */
Flag = 1; /* 标记为存在重复字符 */
}
else
{
if (Flag) /* 若存在重复字符 */
d = dest + strlen(dest); /* 重新计算 d 指针位置 */
else
d++; /* 否则 d 向后移动 */
*d = *s; /* 取下一个字符 */
*(d+1) = '\0'; /* 补充 '\0',原因是原来的 '\0' 可能被覆盖掉 */
T = 1; /* 恢复下一个字符的记数器初始值 */
Flag = 0; /* 恢复重复标记为不存在,原因是还不知道是否存在 */
}
}
}

[此贴子已经被作者于2007-4-28 14:08:49编辑过]


欢迎加入 MVC 技术讨论群(新群:90093426)
2007-04-28 13:06
快速回复:[讨论]挑战!今天一家牛公司给的c语言面试题!!(限时一下午)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.045222 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved