常見面試題

題目來源:https://www.nowcoder.com/discuss/134826?type=all&order=time&pos=&page=1

  1. 堆排序
  2. sqrt的實現
  3. 單鏈表的複製,
  4. 實現一個hash class,
  5. 一個整數的二進制表示翻轉輸出,6(110)轉換後 3(011)
  6. lower_bound 的實現
  7. 一個k*k的矩陣,每行取一個數相加,總有k的k次方種和,求出所有的和中的前k個小的和。
  8. 單元最短路徑
  9. 給定多個pair<節點, 父節點> 構建還原多叉樹
  10. string 轉int
  11. int 轉string
  12. 帶隨機指針的鏈表的複製
  13. 有序數組的部分翻轉(如456123)查找指定值,(數組含有的元素重複與不重複)
  14. memcpy實現
  15. 鏈表的環路,判斷以及環路的入口點
  16. 給定一個string數組,判斷給定string同構的個數
  17. I am a student 翻轉成 student a am I
  18. 有序數組查找超過一半的元素
  19. 數組的中位數
  20. 二分查找
  21. 在數據量(n)很大的情況下,求n個數的平均數(大整數問題)
  22. 漢諾塔
  23. 24點和
  24. 循環隊列的實現
  25. 尋找兩個有序數組的中位數


  • 2.sqrt的實現
    常見方法,二分法,牛頓迭代
    牛頓迭代: Xn+1= Xn - f(X)/f(X)’
    令f(X) = X^2 =a ;
    -> Xn+1 = Xn -(Xn2- a)/ 2Xn = (Xn2 + a ) / 2Xn = (Xn+a/Xn)/2 ;
    double  sqrtNewton( double a)
    {
    		double eps = 0.00000001;
    		if(a< esp)return 0 ;
    		double last = 0;
    		double new =a ;
    		while(abs(new-0) > esp)
    		{
    			last = new;
    			new = (last+ a/last)/2 ;
    		}
    		return new;
    }
    

  • 14,memcpy實現
    注意地址重疊的時候從後向前複製
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void *Memcpy(void *dst, const void *src, size_t size);

int main(int argc, char *argv[])
{
   char buf[100] = "abcdefghijk";
   //memcpy(buf+2, buf, 5);
   Memcpy(buf+2, buf, 5);
   printf("%s\n", buf+2);
}

void *Memcpy(void *dst, const void *src, size_t size)
{
   char *psrc;
   char *pdst;

   if(NULL == dst || NULL == src)
   {
       return NULL;
   }

   if((src < dst) && (char *)src + size > (char *)dst) // 自後向前拷貝
   {
       psrc = (char *)src + size - 1;
       pdst = (char *)dst + size - 1;
       while(size--)
       {
           *pdst-- = *psrc--;
       }
   }
   else
   {
       psrc = (char *)src;
       pdst = (char *)dst;
       while(size--)
       {
           *pdst++ = *psrc++;
       }
   }

   return dst;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章