題目來源:https://www.nowcoder.com/discuss/134826?type=all&order=time&pos=&page=1
- 堆排序
- sqrt的實現
- 單鏈表的複製,
- 實現一個hash class,
- 一個整數的二進制表示翻轉輸出,6(110)轉換後 3(011)
- lower_bound 的實現
- 一個k*k的矩陣,每行取一個數相加,總有k的k次方種和,求出所有的和中的前k個小的和。
- 單元最短路徑
- 給定多個pair<節點, 父節點> 構建還原多叉樹
- string 轉int
- int 轉string
- 帶隨機指針的鏈表的複製
- 有序數組的部分翻轉(如456123)查找指定值,(數組含有的元素重複與不重複)
- memcpy實現
- 鏈表的環路,判斷以及環路的入口點
- 給定一個string數組,判斷給定string同構的個數
- I am a student 翻轉成 student a am I
- 有序數組查找超過一半的元素
- 數組的中位數
- 二分查找
- 在數據量(n)很大的情況下,求n個數的平均數(大整數問題)
- 漢諾塔
- 24點和
- 循環隊列的實現
- 尋找兩個有序數組的中位數
- 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;
}