天天看點

一道360面試題引發的思考

       題目要求:輸入一個數代表多少位元組,輸出其對應的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;
}