当前位置: 首页 > news >正文

php 数组穷举加法_PHP、PYTHON经典算法面试题集,算法实例解析,面试通关宝典...

57426f145bce6b56c42eb3e3ce39ee6b.png

算法是每个程序员必备的技能之一

今天给大家介绍一些,经典的算法集锦。掌握这些经典算法,在以后的面试过程中就不用担心算法不过关啦。话不多说,来看实例吧。

1、用PHP实现杨辉三角

a8a75cd400ef47484071b88e2c631a27.gif

杨辉三角

解题思路:设置两个变量分别为行数和列数,第一列和最后一列的值都为1(即代码中的$j = 0和$i = $j),中间的数值计算方式为上一行的本列数+上一行的前一列数(即$a[$i][$j] = $a[$i-1][$j-1] + $a[$i-1][$j])

PHP代码实现如下:

<?php //PHP实现杨辉三角$n = 10;//总行数for ($i = 0; $i < $n; $i++) {//i:行数 j:列数  for ($j = 0; $j <= $i; $j++) {    if ($i == $j || $j == 0) {      $a[$i][$j] = 1;    } else {      $a[$i][$j] = $a[$i-1][$j] + $a[$i-1][$j-1];    }    echo $a[$i][$j] . "";  }  echo "
";}

2、写一段代码判断单向链表中有没有形成环,如果形成环,请找出环的入口处即P点。

1a62e97380604f23ef2441709d312b0f.png

解题思路:定义两个指针:慢指针(slow),快指针( fast)。slow指针一次走1个结点,fast指针一次走2个结点。如果链表中有环,那么慢指针一定会再某一个时刻追上快指针(slow == fast)。如果没有环,则快指针会第一个走到NULL。

PHP代码如下:

class Node{  public $data=null;  public $next=null;}function eatList(Node $node) {  $fast = $slow = $node;  $first_target = null;  if($node->data == null) {  return false;}  while (true) {    if($fast->next != null && $fast->next->next != null) {      $fast = $fast->next->next; //快指针一次走两步      $slow = $slow->next; //慢指针一次走一步    } else {    return false;  }  if($fast == $slow) { //慢指针追上快指针,说明有环    $p1 = $node; //p1指针指向head节点,p2指针指向它们第一次相交的点,然后两个指针每次移动一步,当它们再次相交,即为环的入口    $p2 = $fast;    while($p1 != $p2) {      $p1 = $p1->next;      $p2 = $p2->next;    }    return $p1; //环的入口节点    }  }}

3、有1000瓶药水,其中只有一瓶有毒。现在用小白鼠进行实验,小白鼠只要服用任意量有毒药水就会在24小时内死亡。问至少要用多少只小白鼠进行实验才能检测出哪瓶药水有毒?

解题思路:把每一瓶水按顺序编号并用二进制标示,如下:
0000000001 (第1瓶)
0000000010 (第2瓶)
0000000011 (第3瓶)
......
1111101000 (第1000瓶)
接下来,从右到左从每一位上为1的瓶子里取出一滴药水混合成一瓶并依次编号。比如从右边第一位开始,把为1的药水混合并编号为1号瓶;第二位中把所有为1的药水混合并编号为2号瓶,依次类推。
把10只小白鼠从右到左依次排列,且喂食编号从1到10的瓶子里的药水。24小时后,死掉的小白鼠位置上标记为1,其余的标记为0,把结果转换成十进制,即为有毒的药水编号。

4、约瑟夫环算法

有15个基督徒和15个非基督徒在海上遇险,为了能让一部分人活下来不得不将其中15个人扔到海里面去。

于是有个人想了个办法就是大家围成一个圈,由某个人开始从1报数,报到9的人就扔到海里面,他后面的人接着从1开始报数,报到9的人继续扔到海里面,直到扔掉15个人。
由于上帝的保佑,15个基督徒都幸免于难,问这些人最开始是怎么站的,哪些位置是基督徒哪些位置是非基督徒。

PHP代码如下:

public function circle($arr, $key)    {        $counter = $index = $num = 0;        while ($counter < 15) {            if ($arr[$index]) {                $num += 1;                if ($num == $key) {                    $arr[$index] = false;                    $counter += 1;                    $num = 0;                }                $index += 1;            }        }        return $arr;    }
3103a9474120498540174339f69ceb47.png

5、判断下面扩号是否闭合,左右对称即为闭合: ((())),)(()),(()))),(((((()),(()()),()()。

解题思路:我们可以通过栈来实现,遇到左括号进栈,遇到右括号出栈(如果栈里没有,说明不闭合),遍历到最后元素,判断栈内为空,即为闭合

PHP代码如下:

function checkStr($str)    {        $stack = [];        for ($i = 0; $i < strlen($str); $i++) {            if ($str[$i] == '(') {                $stack[] = $str[$i];            } elseif ($str[$i] == ')') {                if (empty($stack)) {                    return false;                }                array_pop($stack);            }        }        if (count($stack) > 0) {            return false;        }        return true;    }

6、五人分鱼

A、B、C、D、E五人在某天夜里合伙捕鱼 最后疲惫不堪各自睡觉
第二天A第一个醒来 他将鱼分为5份 扔掉多余的1条 拿走自己的一份
B第二个醒来 也将鱼分为5份 扔掉多余的1条 拿走自己的一份
然后C、D、E依次醒来也按同样的方式分鱼 问他们至少捕了多少条鱼?

解题思路:使用穷举法,假设有x条鱼,那么 x-1除以5可以整除;剩下的鱼的数量为((x-1)/5)*4,这个数量同样满足前边的条件。

python代码如下:

def fish():""" 五人分鱼 """fish = 1while True:total = fishenough = Truefor _ in range(5):if (total - 1) % 5 == 0:total = (total - 1) // 5 * 4else:enough = Falsebreakif enough:print(fish)breakfish += 1

7、归并排序

f16c906b994363ffcc32db8b175d6021.png

排序思想:把一个数组平分成两个数组,然后分别再把两个数组分别平均分成两个数组,直到每个数组中只有一个元素为止;然后依次把两个数组排序合并成有序的数组直到最终合并完成

python代码如下:

def merge_sort(arr):""" 归并法/分治法排序 """if len(arr) < 2:return arr[:]mid = len(arr) // 2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right) def merge(left, right):print(left)print(right)print('')result = []index_left, index_right = 0, 0while index_left < len(left) and index_right < len(right):if left[index_left] <= right[index_right]:result.append(left[index_left])index_left += 1else:result.append(right[index_right])index_right += 1result += left[index_left:]result += right[index_right:]return result

8、选择排序

排序原理:取需排序数组的第一个值,作为基准比较值,然后从第二个值开始循环,依次跟这个基准值做比较,如果比基准值小,则交换位置。第二次循环,则取第二个值作为基准值,依此类推。

python代码如下:

def select_sort(origin_items):""" 选择排序算法 """items = origin_items[:]for i in range(len(items) -1):min_index = ifor j in range(i + 1, len(items)):if items[j] < items[min_index]:min_index = jitems[i], items[min_index] = items[min_index], items[i]return items
bbc8ec47b29988ad00c992ca73d51745.png

9、冒泡排序

排序思想:从第一个数组元素开始,依次比较相邻两个元素的值,保持大的数值在后边,那么第一次循环过后,最大的一个数就到了最后的位置。


第二次循环从0开始到倒数第二个元素,因为最后一个元素已经是最大的了,无需在进行比较,然后重复上述步骤,依次类推。

python代码如下:

def bubble_sort(origin_items):""" 冒泡排序算法 """items = origin_items[:]for i in range(len(items) - 1):for j in range(0, len(items) - 1 -i):if items[j] > items[j + 1]:items[j], items[j + 1] = items[j + 1], items[j]return items

相关文章:

  • -命令替换+实战
  • mysql 安装 时间错误_mysql安装及错误解决
  • ()、[]、{}、(())、[[]]命令替换
  • 变量替换 删除
  • voc数据集格式_目标检测领域数据集VOC+COCO数据集下载地址
  • mysql数据库挂科_MySQL数据库--练习
  • citespace 从安装到项目新建
  • citespace基本操作
  • php连接mysql截图_php连接mysql数据库
  • citespace 时区图 时线图 凸显图
  • idea develop分支 拉取其他分支代码_10年经验17张图带你进入gitflow企业项目代码版本管理的最佳实践...
  • citespacewebofscience下载数据
  • mysql1702_MySQL的通用优化方法
  • 从wos到结果分析 详细
  • 堆排序重建堆的时间复杂度_排序算法之 堆排序 及其时间复杂度和空间复杂度...
  • 《Java编程思想》读书笔记-对象导论
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • Iterator 和 for...of 循环
  • js对象的深浅拷贝
  • leetcode98. Validate Binary Search Tree
  • Netty 4.1 源代码学习:线程模型
  • php面试题 汇集2
  • python 装饰器(一)
  • Python连接Oracle
  • Redis在Web项目中的应用与实践
  • WinRAR存在严重的安全漏洞影响5亿用户
  • 从零开始的webpack生活-0x009:FilesLoader装载文件
  • 浮现式设计
  • 近期前端发展计划
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端技术周刊 2019-02-11 Serverless
  • 如何设计一个比特币钱包服务
  • 如何学习JavaEE,项目又该如何做?
  • 深度学习入门:10门免费线上课程推荐
  • 智能合约开发环境搭建及Hello World合约
  • 阿里云重庆大学大数据训练营落地分享
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #《AI中文版》V3 第 1 章 概述
  • #laravel 通过手动安装依赖PHPExcel#
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (1)Map集合 (2)异常机制 (3)File类 (4)I/O流
  • (3)STL算法之搜索
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)spring boot校园健康监测管理系统 毕业设计 151047
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)scrum常见工具列表
  • (转)菜鸟学数据库(三)——存储过程
  • .NET CORE 3.1 集成JWT鉴权和授权2
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作