单链表的结点类

/

class LNode{

php判断是顺子PHP中高等面试题 – 第二天 GraphQL

//为了简化访问单链表,结点中的数据项的访问权限都设为public

public int data;

public LNode next;

}

class LinkListUtli {

//当单链表中没有环时返回null,有环时返回环的入口结点

public static LNode searchEntranceNode(LNode L)

{

LNode slow=L;//p表示从头结点开始每次今后走一步的指针

LNode fast=L;//q表示从头结点开始每次今后走两步的指针

while(fast !=null && fast.next !=null)

{

if(slow==fast) break;//p与q相等,单链表有环

slow=slow.next;

fast=fast.next.next;

}

if(fast==null || fast.next==null) return null;

// 重新遍历,探求环的入口点

slow=L;

while(slow!=fast)

{

slow=slow.next;

fast=fast.next;

}

return slow;

}

}

二、从扑克牌中随机抽出 5 张牌,判断是不是一个顺子,即这5张牌是连续的

这个问题有个关键点,扑克牌,1-13 不能再多了。
这就很大略了。
用PHP来做,定义一个数组分别存着1到13, 拿出一个,置空一个,末了看下这五个置空的 是不是连续的。
这种情形不考虑抽出的顺序。

三、说一下 PHP 的(内存)垃圾回收机制

每一个变量对应一个 zval 数据构造,在该构造内还有一个 val 构造体,该构造体内有一个引用计数(php7 而言,对付 php5,这个引用计数是保存在 zval 构造中的),标识该工具的引用数,当工具的引用计数为 0 时期表这个工具可被回收。

工具的 refcount 减少的机遇:修正变量、函数返回(开释局部变量)、unset 变量

对付数组和工具而言,可能存在变量中的成员引用变量本身的情形,也便是循环引用,这样会造成这个变量永久不会被内存回收,而成为垃圾。

PHP 里对付这种情形给出了垃圾回收机制:如果数组、工具的引用计数减少而且不为零,则认为他们可能是垃圾,把他们放到垃圾网络器里。
等垃圾网络器到了一定的数量之后,进行垃圾处理:对所有可能的垃圾 refcount 减 1,如果为 1,解释是垃圾,则进行内存回收;如果不为 1,解释还有其他变量在利用,refcount 重新加 1;这种工具复用以及垃圾回收机制在其他措辞中也有表示:redis 中也利用了引用计数表示每个工具的引用数量。

四、简述一下PHP短信验证码如何防刷?

1、韶光限定:60 秒后才能再次发送

从发送验证码开始,前端(客户端)会进行一个 60 秒的倒数,在这一分钟之内,用户是无法提交多次发送信息的要求的。
这种方法虽然利用得比较普遍,但是却不是非常有用,技能轻微好点的人完备可以绕过这个限定,直接发送短信验证码。

2、手机号限定:同一个手机号,24 小时之内不能够超过 5 条

对利用同一个手机号码进行注册或者其他发送短信验证码的操作的时候,系统可以对这个手机号码进行限定,例如,24 小时只能发送 5 条短信验证码,超出限定则进行报错(如:系统繁忙,请稍后再试)。
然而,这也只能够避免人工手动刷短信而已,对付批量利用不同手机号码来刷短信的机器,这种方法也是无可奈何的。

3、短信验证码限定:30 分钟之内发送同一个验证码

网上还有一种方法说:30 分钟之内,所有的要求,所发送的短信验证码都是同一个验证码。
第一次要求短信接口,然后缓存短信验证码结果,30 分钟之内再次要求,则直接返回缓存的内容。
对付这种办法,不是很清楚短信接口商会不会对发送缓存信息收取用度,如果有兴趣可以理解理解。

4、前后端校验:提交 Token 参数校验

这种办法比较少人说到,个人以为可以这种方法值得一试。
前端(客户端)在要求发送短信的时候,同时向做事端提交一个 Token 参数,做事端对这个 Token 参数进行校验,校验通过之后,再向要求发送短信的接口向用户手机发送短信。

5、唯一性限定:微信产品,限定同一个微信 ID 用户的要求数量

如果是微信的产品的话,可以通过微信 ID 来进行识别,然后对同一个微信 ID 的用户限定,24 小时之内最多只能够发送一定量的短信。

6、产品流程限定:分步骤进行

例如注册的短信验证码利用场景,我们将注册的步骤分成 2 步,用户在输入手机号码并设置了密码之后,下一步才进入验证码的验证步骤。

7、图形验证码限定:图形验证通过后再要求接口

用户输入图形验证码并通过之后,再要求短信接口获取验证码。
为了有更好的用户体验,也可以设计成:一开始不须要输入图形验证码,在操作达到一定量之后,才须要输入图形验证码。
详细情形请根据详细场景来进行设计。

8、IP 及 Cookie 限定:限定相同的 IP/Cookie 信息最大数量

利用 Cookie 或者 IP,能够大略识别同一个用户,然后对相同的用户进行限定(如:24 小时内最多只能够发送 20 条短信)。
然而,Cookie 能够清理、IP 能够仿照,而且 IP 还会涌现局域网相同 IP 的情形,因此,在利用此方法的时候,该当根据详细情形来思考。

9、短信预警机制,做好出问题之后的防护

以上的方法并不一定能够完备杜绝短信被刷,因此,我们也该当做好短信的预警机制,即当短信的利用量达到一定量之后,向管理员发送预警信息,管理员可以急速对短信的接口情形进行监控和防护。

五、mySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何担保 redis 中的数据都是热点数据

干系知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)。
redis 供应 6 种数据淘汰策略:

volatile-lru:从已设置过期韶光的数据集(server.db [i].expires)中挑选最近最少利用的数据淘汰

volatile-ttl:从已设置过期韶光的数据集(server.db [i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期韶光的数据集(server.db [i].expires)中任意选择数据淘汰

allkeys-lru:从数据集(server.db [i].dict)中挑选最近最少利用的数据淘汰

allkeys-random:从数据集(server.db [i].dict)中任意选择数据淘汰

no-enviction(驱逐):禁止驱逐数据