php面经

使用二分法查找数组中某元素的位置(应该是排好序的)

<?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、消息推送的实现(非记忆)

建立长连接 APP  web

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)交给从数据库来处理,数据库复制,就是把事务性操作导致的变更  同步到集群中的从数据库(主从复制)。

       ②读写分离原因:写操作的速度相对读操作要慢,耗费时间长,解决数据库写操作影响读操作的问题

       详解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值