几道面试题目?大家看看,给下答案!!

chun799 2009-04-21 05:57:24
一、写个函数将一个32位RGB像素的颜色值转化为灰度,RGB转化为灰度的公式grey=0.3*red+0.59*green+0.11*blue.RGB像素的格式(左边是最高位,右边是最低位)00000000RRRRRRRRGGGGGGGGBBBBBBBB
unsigned int ToGrey(unsigned int rgb)
{

}

二、写函数找出一个字符串中出现频率最高的字符(如果最高频率相同的有多个字符,取最先遇见的那个字符)

三、优化下面函数的运行速度
void fillArray (char *src,int len ,char *dest,int idx)
{
for(int i=0;i<len;i++)
{
dest[idx++]=src[i];
}
}

四、哪些情况下下面的输出的结果是不同
#define SQR(x)(x*x)
inline int sqr(const int x){return (x*x);}


...全文
795 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
chun799 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 bitxinhai 的回复:]
void fillArray (char *src,int len ,char *dest,int idx)
{
memcpy(dest+idx,src,len+1);//使用memcpy拷贝块内存,效率会很高的~~~~~~~~~
}

void main()
{
char str1[10]="abcd",str2[10] = "ijkl";

fillArray(str1,4,str2,4);

cout < <str1 < <endl;
cout < <str2 < <endl;
}
[/Quote]
chun799 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 kendy_ke 的回复:]
#define RED(x) ((x>>24)&0xff) //多移了#define RED(x) ((x>>16)&0xff)#define GREEN(x) ((x>>16)&0xff) //多移了#define GREEN(x) ((x>>8)&0xff)
#define BLUE(x) (x0xff)

unsigned int ToGrey(unsigned int rgb)
{
return (RED(rgb)*3/10 + GREEN(rgb)*59/100 + BLUE(rgb)*11/100);
}
[/Quote]
chun799 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 heguodong 的回复:]
三、优化下面函数的运行速度
void fillArray (char *src,int len ,char *dest,int idx)
{
for(int i=0;i <len;i++)
{
dest[idx++]=src[i];
}
}

---->
void fillArray (char *src,int len ,char *dest,int idx)
{
memcopy(dest+i,src,len*sizeof(char)) //函数名写错了,还有参数,更在下memcpy(dest+idx,src,len)
}
[/Quote]
wwwypy 2009-04-24
  • 打赏
  • 举报
回复
第二题:你修改一下就可以了,
#include <iostream>
#include <string>
using namespace std;
int main()
{
int N;
int count[1000]={0};
int i =0;
char num[1000],a[1000],*p;
char output[2001];
scanf("%d",&N);
while (N--)
{
memset(count,0,1000);
memset(num,'\0',1000);
memset(a,'\0',1000);
i=0;
p=num;
scanf("%s",p);
a[0]=*p;
while (*p!='\0')
{
if (a[i]==*p)
{
count[i]++;
}
else
{
i++;
a[i]=*p;
count[i]++;
}
p++;
}
for (int k=0;k<=i;k++)
{
printf("%d%c",count[k],a[k]);
}
printf("\n");
}
return 0;
}

pathuang68 2009-04-24
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 pathuang68 的回复:]
三、优化下面函数的运行速度。
>> memcpy解决之。memcpy最适合做这类事情了,在c/c++中最快的了, 因此15楼是正解。

四、哪些情况下下面的输出的结果是不同
#define SQR(x)(x*x)
inline int sqr(const int x){return (x*x);}

>> 上面的#define的写法,至少应该写成:
>> #define SQR(x)((x)*(x))
>> 否则运算优先级可能会有问题。另外,想这种情况尽量不要使用#define宏。考虑下面代码:
>> int x = 5;
>> …
[/Quote]

Sorry,还没检查就回了!上面
>> int sqr = SQR(x++);
应该是:
>> int sqr = SQR(x++);
才会有后面的结论。

如果写成
>> int sqr = SQR(x++);
那么结果应该是30


没有验证,大家可以帮帮验证一下。
pathuang68 2009-04-24
  • 打赏
  • 举报
回复
三、优化下面函数的运行速度。
>> memcpy解决之。memcpy最适合做这类事情了,在c/c++中最快的了, 因此15楼是正解。

四、哪些情况下下面的输出的结果是不同
#define SQR(x)(x*x)
inline int sqr(const int x){return (x*x);}

>> 上面的#define的写法,至少应该写成:
>> #define SQR(x)((x)*(x))
>> 否则运算优先级可能会有问题。另外,想这种情况尽量不要使用#define宏。考虑下面代码:
>> int x = 5;
>> int sqr = SQR(x++);
>> 那么sqr会是多少?
>> 可能会出乎部分朋友所料,不是36,而是42。


inline函数是没有问题的。
lpf000 2009-04-22
  • 打赏
  • 举报
回复
一、写个函数将一个32位RGB像素的颜色值转化为灰度,RGB转化为灰度的公式grey=0.3*red+0.59*green+0.11*blue.RGB像素的格式(左边是最高位,右边是最低位)00000000RRRRRRRRGGGGGGGGBBBBBBBB // 不会;

二,简单;
三,void fillArray (char *src,char *dest,)
{ while(*src)
*dest++=*src++;
}
四、哪些情况下下面的输出的结果是不同
#define SQR(x)(x*x)
inline int sqr(const int x){return (x*x);} //只能为int

SQR(2.1);
sqr(2.1);
rainbow_free 2009-04-22
  • 打赏
  • 举报
回复
mark
hylove9494 2009-04-22
  • 打赏
  • 举报
回复
sf
Jinhao 2009-04-22
  • 打赏
  • 举报
回复
1,

struct grey_table
{
grey_table()
{
for(unsigned int i = 0; i < 0xFF; ++i)
{
red[i] = (static_cast<unsigned>(0.3 * i) << 16);
green[i] = (static_cast<unsigned>(0.59 * i) << 8);
blue[i] = static_cast<unsigned>(0.11 * i);
}
}
unsigned int red[0xFF];
unsigned int green[0xFF];
unsigned int blue[0xFF];
};


unsigned int ToGrey(unsigned int rgb)
{
static grey_table gt;
return gt.red[(rgb >> 16)] + gt.green[(rgb >> 8) & 0xFF] + gt.blue[rgb & 0xFF];
}



wind_breez 2009-04-22
  • 打赏
  • 举报
回复
#define SQR(x)(x*x)
inline int sqr(const int x){return (x*x);}

int i = 1;
SQR(i++)与sqr(i++);不同
wind_breez 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用楼主 chun799 的帖子:]
一、写个函数将一个32位RGB像素的颜色值转化为灰度,RGB转化为灰度的公式grey=0.3*red+0.59*green+0.11*blue.RGB像素的格式(左边是最高位,右边是最低位)00000000RRRRRRRRGGGGGGGGBBBBBBBB

unsigned int ToGrey(unsigned int rgb)
{
r = rgb >> 16;
g = (rgb & 0xff00)>>8;
b = (rgb & 0x00ff);
return 0.3*r+0.59*g+0.11*b;
}
maosher 2009-04-22
  • 打赏
  • 举报
回复
#define SQR(x)(x*x)
inline int sqr(const int x){return (x*x);}


x为包含优先级低于*操作符的表达式时;
x不为int型时(SQR没有类型检查);
taoyanxu1989 2009-04-22
  • 打赏
  • 举报
回复
还行
flameearth 2009-04-22
  • 打赏
  • 举报
回复
kan ~~~~~~~~~~
wjksd 2009-04-22
  • 打赏
  • 举报
回复
顶啊[Quote=引用 7 楼 lijinfenghust 的回复:]
二、写函数找出一个字符串中出现频率最高的字符(如果最高频率相同的有多个字符,取最先遇见的那个字符)


C/C++ code
char afun(const char *str)
{
int temp[255]={};
char freqChar=0;;
int freqMax=0;

const char *p=str;
while(*p!='\0')
{
temp[*p]++;
if(temp[*p]>freqMax)
{
freqMax=temp[*p];
freqChar=*p;
}

[/Quote]
lllsui 2009-04-22
  • 打赏
  • 举报
回复
^^
really3353 2009-04-22
  • 打赏
  • 举报
回复
第一题:

unsigned int ToGrey( unsigned int RGB )
{
unsigned char *puc = ((unsigned char *)&RGB);
unsigned char red, green, blue;

blue = *puc;
green = *( ++puc );
red = *( ++puc );

unsigned int grey = 0.3 * red + 0.59 * green + 0.11 * blue;

return grey;
}
帅得不敢出门 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 kendy_ke 的回复:]

三、优化下面函数的运行速度
void fillArray (char *src,int len ,char *dest,int idx)
{
for(int i=0;i <len;i++)
{
dest[idx++]=src[i];
}
}

void fillArray (char *src,int len ,char *dest,int idx)
{
if( (((int) &dest[idx] | (int) src) & 3) == 0 )
{
while(len >= 4)
{
*(int *) &dest[idx] = *(int *)src;
idx += 4;
src += 4;
len -= 4;
}
goto copy_…
[/Quote]
else部分可以考虑循环展开。
chun799 2009-04-22
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 beginfromzero 的回复:]
好像用位运算效率稍高
[/Quote]
第三题用位运算可以优化程序??怎么做??
加载更多回复(26)

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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