题目要求:输入一个数代表多少字节,输出其对应的GBytes/Mbytes/Kbytes/Bytes。


       说下当时自己的思路,首先,听到题目,这不是很简单吗?大致写了,可能考察点是不是宏定义、常量定义,因为常量const定义比宏定义有可调试,可有数据类型等的优势,选定常量定义的方法。


const long GBYTES = 1024*1024*1024;
const long MBYTES = 1024*1024;
const long KBYTES = 1024;

void ByteTransformFun_init(longlByteVal)
{
longlByteRtn = 0;

if(lByteVal< KBYTES)
{
printf("%ldBytes = %ld Bytes\n",lByteVal,lByteVal);
}
elseif(lByteVal >= KBYTES && lByteVal < MBYTES)
{
lByteRtn= (lByteVal)/KBYTES;
printf("%ldBytes = %ld KBytes\n",lByteVal,lByteRtn);
}
elseif(lByteVal >= MBYTES && lByteVal < GBYTES)
{
lByteRtn= (lByteVal)/MBYTES;
printf("%ldBytes = %ld MBytes\n",lByteVal,lByteRtn);
}
else
{
lByteRtn= (lByteVal)/GBYTES;
printf("%ldBytes = %ld GBytes\n",lByteVal,lByteRtn);
}

}


        明显,答完这道题后,一是由于比A4小不少的一块笔试试卷区域,写的有勾画现象;二是最关键的,考虑出题者的意图和实际判断的方式了吗?


有没有更简单的方法?面试官随即问道,没等我思考,他便指出,这种判断的冗余多次判断问题,说这是常识性的问题,不该出错。


,临场分析问题的能力,要有思考,不能上来就顺着性子走,这样看似节约了时间,实际是南辕北撤;

,平时或多或少遇到过类似的逻辑判断语句过,思考过如何精简程序,提高执行效率吗?这是平时所欠缺的,这点也体现了自己的积累不够。

正确代码及对比如下:初始为_init,正确代码为_new。并做了测试如下:

const long GBYTES = 1024*1024*1024;
const long MBYTES = 1024*1024;
const long KBYTES = 1024;

int main()
{
void ByteTransformFun_init(long lByteVal);
void ByteTransformFun_new(long lByteVal);
void ByteTransformFun_pithy( long lByteVal);
long lByteArray[5] = {150000000L,134000L,15000L,16008880L,20023400L};

for(int i = 0; i < 5; i++)
{
ByteTransformFun_init(lByteArray[i]);
}
printf("\n\n");

for( i = 0; i < 5; i++)
{
ByteTransformFun_new(lByteArray[i]);
}
printf("\n\n");
for( i = 0; i < 5; i++)
{
ByteTransformFun_pithy(lByteArray[i]);
}
return 0;
}


//思路-->写法
void ByteTransformFun_new(long lByteVal)
{
long lByteRtn = 0;
if(lByteVal > GBYTES)
{
lByteRtn = (lByteVal)/GBYTES;
printf("%ld Bytes = %ld GBytes\n",lByteVal,lByteRtn);
}
else if(lByteVal > MBYTES)
{
lByteRtn = (lByteVal)/MBYTES;
printf("%ld Bytes = %ld MBytes\n",lByteVal,lByteRtn);
}
else if(lByteVal > KBYTES)
{
lByteRtn = (lByteVal)/KBYTES;
printf("%ld Bytes = %ld KBytes\n",lByteVal,lByteRtn);
}
else
{
printf("%ld Bytes = %ld Bytes\n",lByteVal,lByteVal);
}
}


//多了n次判断,不简洁.
void ByteTransformFun_init(long lByteVal)
{
long lByteRtn = 0;

if(lByteVal < KBYTES)
{
printf("%ld Bytes = %ld Bytes\n",lByteVal,lByteVal);
}
else if(lByteVal >= KBYTES && lByteVal < MBYTES)
{
lByteRtn = (lByteVal)/KBYTES;
printf("%ld Bytes = %ld KBytes\n",lByteVal,lByteRtn);
}
else if(lByteVal >= MBYTES && lByteVal < GBYTES)
{
lByteRtn = (lByteVal)/MBYTES;
printf("%ld Bytes = %ld MBytes\n",lByteVal,lByteRtn);
}
else
{
lByteRtn = (lByteVal)/GBYTES;
printf("%ld Bytes = %ld GBytes\n",lByteVal,lByteRtn);
}

}


//博友jadedrip提供的算法,简介有力!佩服!
void ByteTransformFun_pithy( long lByteVal )
{
std::cout << lByteVal << "Bytes = ";
static const char* prx[]={ "B", "KB", "MB", "GB" };
int i=0;
for( ; lByteVal >= 1024 && i<3; ++i )
{
lByteVal = lByteVal >> 10; //等价byte = byte/1024;
}
std::cout << lByteVal << prx[i] << std::endl;
}



【2013-1-22】博友jadedrip提供的ByteTransformFun_pithy(long lByteVal)实现方法,简介有力,用到了字符数组、循环、右移运算,估计这正是360面试官最想看到,佩服佩服!看到了差距,好好学习!谢谢这位博友!

       这个面试题引起了我平时写程序没有考虑效率、思考少,能实现功能就好的缺点的深思。