目录
261. 设计和实现一个LRU (最近最少使用)缓存数据结构,使它应该支持一下操作:get和put。
262. 已知sqrt(2)约等于1.414,要求不用数学库,求sqrt⑵ 精确到小数点后10位。
263. 给定一个二叉搜索树(BST),找到树中第K小的节点。
269. redis中的网络IO有了解过吗,它是单线程的还是多线程的,为什么要用单线程。
274. 在函数内定义一个字符数组,用gets函数输入字符串的时候,如果输入越界,为什么程序会崩溃?
276. 从innodb的索引结构分析,为什么索引的key长度不 能太长?
278. 曹操南下攻打刘备,刘备派关羽守锦州,关羽派张飞去守城 门。刘备又派诸葛亮去向孙权求援。孙权派兵攻打曹操.请画 岀UML图.
261. 设计和实现一个LRU (最近最少使用)缓存数据结构,使它应该支持一下操作:get和put。
get(key)-如果key存在于缓存中,则获取key的value (总是 正数),否则返回
class LRUCache{
public:
LRUCache(int capacity) {
cap = capacity;
}
int get(int key) {
auto it = m. find (key);
if (it == m. end()) return ~1;
1. splice (1. beginO, 1, it~>second); return it->second">second;
void set(int key, int value) { auto it = m. find (key);
if (it != m. end())
1. erase(it~>second);
1. push_front(make_pair(key, value));
m[key] = 1. beginO ;
if (m. size () > cap) {
int k = 1.rbegin()~>first;
l. pop__back ();
m. erase (k);
262. 已知sqrt(2)约等于1.414,要求不用数学库,求sqrt⑵ 精确到小数点后10位。
1. 已知sqrt(2)约等于1.414,那么就可以在(1.4, 1.5)区间做二分查找,如: high=>l.5
low=>l.4
mid => (high+low)/2=1.45
1.45*1.45>2 ? high=>1.45 : low => 1.45
循环到c)
2. 退出条件
前后两次的差值的绝对值<=0.0000000001,则可退出。
代码:
const double EPSINON = 0.0000000001,
double sqrt2()
[
double low = 1.4, high = 1. 5;
double mid = (low + high) / 2;
while (high - low > EPSINON)
high = mid;
}
else
!
low = mid;
}
mid = (high + low) / 2;
}
return mid;
}
263. 给定一个二叉搜索树(BST),找到树中第K小的节点。
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private class ResultType {
//是否找到
boolean found;
//节点数目
int val;
ResultType(boolean found, int val) {
this, found - found;
this, val = val;
}
}
public int kthSmallest(TreeNode root, int k) { return kthSmallestHelper(root, k). val;
private ResultType k thSmalles tHeIp er(TreeNode root, int k) { if (root == null) {
return new ResultType(false, 0);
ResultType left = kthSmallestHelper(root.left, k);
//左子树找到,直接返回
if (left, found) { return new ResultType(tiue, left, val);
}
//左子树的节点数目=K-l,结果为功。t的值
if (k - left, val == 1) { return new ResultType(tiue, root, val);
}
//右子树寻找
ResultType right = kthSmallestHelper(root, right, k - left, val - 1); if (right, found) {
return new ResultType (tiue, right, val);
}
//没找到,返回节点总数
return new ResultType(false, left, val + 1 + right, val);
264. 如何用socket编程实现ftp协议?
以linux为例,使用socket编程中的read。函数和write。函数已可实现文件的发送 接收,为啥还要专门建立ftp协议呢?单单使用:read。函数和write。函数,数据接口和命 令接口未分开,效率低。而ftp将数据接口和命令接口分开,提高了文件传输效率和安全性。
ftp协议的实现仍是使用socket编程,首先是实现tcp连接。
Socket客户端编程主要步骤如下:
socket ()创建一个 Socket
connect ()与服务器连接
write()和readO进行会话
close ()关闭 Socket
Socket服务器端編程主要步骏如下:
socket ()创建一个 Socket
bind()
listenO 监听
accept ()接收连接的请求
write()和readO进行会话
close ()关闭 Socket
建立tcp连接代码简示如下:
SOCKET control_sock;
struct hostent *hp;
struct sockaddr_in server;
memset(^server, 0, sizeof(struct sockaddr_in))
/* 初始化 socket */
control_sock = socket(AF_INET, SOCK_STREAJ.f, 0);
hp = gethostbyname(server_name);
memcpy(&server・ s in_addr, hp->h_addr, hp->h_length);
server. sin_family - AF_INET;
server. sin_port = htons(port);
/*连接到服务器端*/
connect(control_sock, (struct sockaddr *)^server, sizeof(server));
/*客户端接收服务器端的一些欢迎信息*/
read (control_sock, read__buf, read__len);
ftp客户端与服务器建立起tcp连接后,然后向服务器发送命令。(这一步建立的是命 令接口的tcp连接,数据接口连接尚未建立。)
通常第一步发送USER和PASS命令给证账号和密码后登陆服务器。若是匿名服务器则另