使用二分法查找数组中某元素的位置(应该是排好序的)
<?php
function Search($a,$val){
$low = 0;
$high= count($a) - 1;
while($low <= $high){
$mid = intval(($low+$high)/2);
if($a[$mid] == $val)
return $mid;
if($a[$mid] > $val){
$high = $mid - 1;
}else{
$low = $mid + 1;
}
}
return -1;
}
?>
php递归求一个数的阶乘
<?php
function demo($a)
{
if($a > 1)
{
$r=$a*demo($a-1);
}else
{
$r=$a;
}
return $r;
}
$a=6;
echo $a."的阶乘的值".demo($a);
?>
用两个栈(先进后出)实现一个队列(先进先出):完成队列的Push和Pop操作(添加删除最后一个元素)
两个栈。出栈的时候,如果栈2不为空,就出栈2。如果栈2为空,就把栈1的出栈再入栈2。
<?php
$arr1 = array();
$arr2 = array();
function mypush($node)
{
array_push($arr1,$node);
}
function mypop()
{
if(!empty($arr2)){
return array_pop($arr2);
}else{
while(!empty($arr1)){
array_push($arr2, array_pop($arr1));
}
return array_pop($arr2);
}
}
1、求一个数组中第二大的元素。
<?php
// 求一个数组中第二大的元素
function getSecond($arr)
{
$max = 0;
$second = 0;
$count = count($arr);
if ($count == 0) {
return false;
}
for ($i=0; $i < $count; $i++) {
if ($arr[$i] > $max) {
$second = $max;
$max = $arr[$i];
}elseif ($arr[$i] < $max && $arr[$i] > $second) {
$second = $arr[$i];
}
}
return $second;
}
$arr = [3,5,3,7,4,1,33,65,23,2,45];
print_r(getSecond($arr));
2、数组中一个数组出现次数超过数组长度一半,如果说字符串中某字符,可运用函数转换为数组str_split(string,int),按照几个字符分割,默认一个字符。
<?php
// 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
/**
* 方法1:采用用户“分形叶”思路(注意到目标数 超过数组长度的一半,对数组同时去掉两个不同的数字,到最后剩下的一个数就是该数字。如果剩下两个,那么这两个也是一样的,就是结果),在其基础上把最后剩下的一个数字或者两个回到原来数组中,将数组遍历一遍统计一下数字出现次数进行最终判断。
* 方法2:数组排序后,如果符合条件的数存在,则一定是数组中间那个数。(快排O(nlogn))
* 方法3:如果有符合条件的数字,则它出现的次数比其他所有数字出现的次数和还要多。
* 在遍历数组时保存两个值:一是数组中一个数字,一是次数。遍历下一个数字时,若它与之前保存的数字相同,则次数加1,否则次数减1;若次数为0,则保存下一个数字,并将次数置为1。遍历结束后,所保存的数字即为所求。然后再判断它是否符合条件即可。
* 方法3最优
*/
function MoreSum($arr)
{
$count = count($arr);
if ($count == 0) {
return 0;
}
// 定义次数变量$temp, $num
$temp = 0;
$num = $arr[0];
for ($i=0; $i < $count; $i++) {
if ($num == $arr[$i]) {
$temp++;
}else {
$temp--;
}
if ($temp == 0) {
$num = $arr[$i];
$temp = 1;
}
}
$check = check($num,$arr);
if (!$check) {
return 0;
}
return $num;
}
// 校验函数
function check($num,$arr)
{
$count = count($arr);
$tem = 0; //计次函数
for ($i=0; $i < $count; $i++) {
if ($arr[$i] == $num) {
$tem++;
}
}
if ($tem <= $count/2) {
return false;
}
return true;
}
// $arr = [1,2,3,2,2,2,5,4,2];
$arr = [1,2,3,2,4,2,5,2,3];
$res = MoreSum($arr);
print_r($res);
?>
3、列出一个字符串的所有排列组合形式。
4、比较两个字符串,其中一个的排列组合中的某种是否在另一个字符串中存在。
思路:分为两个数组,循环一个数组中的元素,如果另一个数组中有相同的就划掉,如果出现不同,则恢复另一个数组,重新进行比较。
5、索引失效的情况?联合查询时只有没有第一个条件,有其他条件
联合查询的使用union
6、数据库:查找数组中某一个时间段内最大或最小的某个字段 between and
7、删除数组中某个指定的元素,(可以通过key-value交换函数)
<?php
$arr1 = array(1,3, 5,7,8);
$key = array_search(3, $arr1);
if ($key !== false)
array_splice($arr1, $key, 1);
var_dump($arr1);
//结果索引改变 0 1 2 ……
<?php
$arr2 = array(1,3, 5,7,8);
foreach ($arr2 as $key=>$value)
{
if ($value === 3)
unset($arr2[$key]);
}
var_dump($arr2);
?>
//结果 索引未改变 0 2 3 ……
8、堆排序实现代码
9、冒泡排序实现代码
10、快排实现代码
11、laravel框架的理解
12、thinkphp框架联合的使用 concat
13、字符串查找函数(包括中文查找函数)
strpos
14、404、500、204、301
15、控制器的类型
16、Linux配置多域名
17、产生0-1000的随机整数,如果某个数字大于500,输出这个数字。
18、99个数字从1到100中不重复取,求缺失的数字。
答:分别求和,然后求差
19、tcp udp
tcp面向连接,udp是无连接的 详解
20、序列化与反序列化
序列化:将对象的状态信息转换为可以存储或传输的字节序列形式的过程。
反序列化:把字节序列恢复为对象的过程。
21、分区分表
22、消息推送的实现(非记忆)
23、hash
24、一个不平衡的二叉树,只显示最右边的数据
25、mqtt的工作原理
解:消息队列遥测传输协议,是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议基于TCP/IP协议构建。mqtt理解
26、对于支付过程中会发生的突发情况,怎么解决?
解:若回调过程中,处理业务失败(如更新订单状态失败),返回<return_code><![CDATA[FAIL]]></return_code>时,微信会继续发起回调。即使继续回调,在此过程中业务处理失败的问题未得到处理,待微信多次回调结束后,当前订单仍然是“待付款”状态,但用户的钱已经支付了,假设“待付款”的订单无法发货,这样的情况该如何准确处理呢?
P.S.个人认为准确的情况,应该是在回调过程中发生异常处理失败返回FAIL的时候,微信(或我的程序)调用退款接口,将用户支付金额返回到账户,但这样也有两点问题:
1、调用退款接口之后,针对原支付成功的回调,该如何返回?返回FAIL无法终止回调,返回SUCCESS,又感觉不符合场景。
2、调用退款接口,微信端同样会针对这个退款进行回调,如果这个退款的回调再发生异常失败,又如何处理?
27、数据库读写分离的理解
①读写分离就是将事务性的写操作(update/insert/delete)交给主数据库来处理,读操作(select)交给从数据库来处理,数据库复制,就是把事务性操作导致的变更 同步到集群中的从数据库(主从复制)。
②读写分离原因:写操作的速度相对读操作要慢,耗费时间长,解决数据库写操作影响读操作的问题