题目来源: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;
}