php面试总结20190108(三道算法题)

本文分享了面试中的三道编程题解答过程,包括寻找数组平衡点、八进制数到特定字符串转换及银行排队系统的模拟,旨在探讨算法实现与优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是前两天的面试,未能及时总结。这次面试一共就三道题,上来就是先做这三道题,因为笔者比较迟钝,只答出来两道,没有通过笔试,下面是题目和我的答案,如果有大神看到这里,希望不吝赐教,谢谢。

1.有一个数组,设数组中某个元素为分界点,使得分界点两旁的子数组的和相等,如果有分界点,输出分界点下标,如果有多个分界点,输出第一个分界点的下标,如果没有则返回-1。时间复杂度不得超过O(n)。

我先写我的思路和代码,没有关注时间复杂度。。

1)思路:

(1)设某个元素$arr[$i]为分界点;

(2)求分界点两边的和,然后比较,相等则返回$i,不想等,则$i++,继续递归;

(3) 直到数组最后一个元素,如果没有则返回-1;

2)代码:

$arr = [1,2,3,4,3,2,1];
function mid($arr,$i){
	$len = count($arr);
	$sum1 = $sum2 = 0;
	if($i == $len){
		return -1;
	}else{
		for($j=0;$j<$i;$j++){
			$sum1 = $sum1 + $arr[$j];
		}
		for($k=$i+1;$k<$len;$k++){
			$sum2 = $sum2 + $arr[$k];
		}
		if($sum1 == $sum2){
			return $i;
		}else{
			return mid($arr,$i+1);
		}
	}
}
dump(mid($arr,0));die;

输出:

2.将某个8进制数转化为a-z排列的字符串,a代表1,z代表26,aa代表27,以此类推,aaa代表703。比如输入32,输出z。

1)思路:

(1)将八进制数转为10进制数。

(2)按照规则转换。

2)代码:

function ten_num($num){
	$str_num = (string)$num;
	$ten_num = 0;
	$len = strlen($str_num);
	for($i=0;$i<$len;$i++){
		$ten_num = $ten_num + $str_num{$i}*pow(8,$len-$i-1);
	}
	return change($ten_num);
}
function change($num){
	$ar = [];
	//定义一个a-z的数组
	for($i=97;$i<=122;$i++){
		$ar[] = chr($i);
	}
	//键值加1
	foreach ($ar as $key => $value) {
		$arr[$key+1] = $value;
	}
	//求商
	$n1 = (int)($num/26);
	//求余数
	$n2 = $num%26;

	if($n1<=26 && $n1 >0){
		if($n2 == 0){
			return $str =  $arr[$n1-1].'z';
		}else{
			return $str =  $arr[$n1].$arr[$n2];
		}

	}else{
		if($n2 == 0){
			return $str =  change($n1-1).'z';
		}else{
			return $str = change($n1).$arr[$n2];
		}
	}
}


dump(ten_num(32));die;

3.银行取款排队模拟 假设银行有4个柜台,假设某天有200位客户来办理业务,每个客户到达银行的时间和业务处理时间分别用两个数组arrive_time 和 process_time 来描述。 请写程序计算所有客户的平均等待时间,假设每个客户在去到营业部之后先拿号排队,然后在任意一个柜台有空闲的时候,号码数最小的客户上去办理,假设所有的客户拿到号码之后不会因为银行众所周知的慢而失去耐心走掉。(这个有些复杂,自己想的话实在不知道怎么写,以下思路和代码都是从网上看到的,我整理了一下)

1)思路:用一个优先队列保存四个元素,四个元素为正在进行的任务执行完成的时间 * (优先队列会按照任务结束的时间排序, 从队列取到的第一个任务总是最先完成的那个) * 用一个变量保存总的等待时间 * * 先往优先队列放入4个任务,这4个任务的等待时间为0,所以优先队列的4个值为4个任务对应的到达时间和执行时间之和, * 再把剩下的任务一个个加入优先队列,对于这个要加入的任务,他的等待时间为优先队列的第一个元素(四个任务中最先完成的任务) * 的值减去当前任务的开始时间,所以这个要加入的任务的完成时间为“他的等待时间 + 任务到达时间 + 任务执行时间” * 依次遍历完所有的任务,得到最终等待时间 

2)代码:

<?php
function avgTime($arrvie_time,$process_time){
	$total = 0;
	$lasttime = 0;
	$atms = [0,0,0,0];
	for($i=0;$i<count($process_time);$i++){
		$time = $arrvie_time[$i] - $lasttime;
		for($j=0;$j<count($atms);$j++){
			$atms[$j]-=$time;
		}
		$lasttime = $arrive_time[$i];
		$wait = true;
		for($j=0;$j<count($atms);$j++){
			if($atms[$j]<=0){
				$atms[$j] = $process_time[$i];
				$wait = flase;
				exit;
			}
		}
		if($wait){
			$temp = $atms[0];
			for($j=0;$j<count($atms);$j++){
				for($k = $j+1;$k<count($atms);$k++){
					if($atms[$k] < $atms[$j]){
						$temp = $atms[$k];
						$atms[$k] = $atms[$j];
						$atms[$j] = $temp;
					}
					
				}
			}
			$total+=$atms[0];
			$atms[0]+=$process_time[$i];
		}
	}
	return $total/count($process_time);
}

?>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值