排序算法 - 快速排序
快速排序
选择一个基准数,通过一趟排序将要排序的数据分割成独立的两部分;其中一部分的所有数据都比另外一部分的所有数据都要小。然后,再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
选择一个基准数,小值在左,大值在右,递归左子数列和右子数列
核心思想是分治法,分而治之
单边扫描
我们随意抽取一个数作为基准值,同时设定一个标记 mark 代表左边序列最右侧的下标位置,当然初始为 0 ,接下来遍历数组,如果元素大于基准值,无操作,继续遍历,如果元素小于基准值,则把 mark + 1 ,再将 mark 所在位置的元素和遍历到的元素交换位置,mark 这个位置存储的是比基准值小的数据,当遍历结束后,将基准值与 mark 所在元素交换位置即可。
遍历数列后,mark 下标所在元素为数列中,小于基准值的最右侧元素,此时mark下标左侧数列包含基准值,交换基准值和mark位置元素后,基准值位置左侧的所有元素都是小于基准值,右侧所有元素都是大于基准值
代码实现function quick_sort_1(array &$arr, $start_ ...
排序算法 - 冒泡排序
冒泡排序 Bubble-sort
简单的排序算法,遍历多次需要排序的数列。每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止!
代码实现function bubble_sort(array $arr){ if (count($arr) <= 1) { return $arr; } for ($i = 0; $i < count($arr) - 1; $i++) { $sort = false; for ($j = 0; $j < count($arr) - $i - 1; $j++) { if ($arr[$j] > $arr[$j + 1]) { $temp = $arr[$j + 1]; ...
PHP实现字符串反转
最小代价实现将字符串完全反序, e.g. 将 “1234567890” 转换成 “0987654321”
要实现字符串反转,有两种方式:
PHP自带函数
不使用函数(循环)
使用 PHP 自带函数$a = '1234567890';// 输出 0987654321echo strrev($a);
不使用函数(循环)$str = '';$i = 0;while( isset($a[$i]) && !is_null($a[$i])) { $str = $a[$i++].$str;}// 输出 0987654321echo $str;
拓展上面两种方式,反转含有中文的字符串时,会因为编码出现乱码问题。
解决:
mb 系列函数没有直接实现反转的函数,于是用循环的方式去实现。
$a = '@#¥(*&中文一段abcdefg^';function my_strrev(string $string) { if (empty($string)) { ...
403可能出现的原因是什么?怎么解决?
403可能出现的原因是什么?一、启动用户和 nginx 工作用户不一致查看运行 nginx 的用户
# 输出启动用户ps aux | grep "nginx: worker process" | awk '{print $1}'
解析:
ps 查看进程
ps a 显示现行终端的所有程序
ps u 以用户为主的格式显示程序状态
ps x 显示所有程序,不以终端机来区分
grep 搜索匹配
awk 文本分析,上述例子中,每行按空格或TAB分割,输出文本中的第1项
修改 nginx.config 的用户
vi /etc/nginx/nginx.conf
二、缺少 index.html 或 index.phpnginx 配置文件中 server 块配置目录找不到 index 的文件
server { listen 80; server_name localhost; root /www/; index index.php index.html;}
三、权限问题nginx 没有操作配 ...
js-click-copy, js实现点击按钮复制文本功能
系统开发中,有些业务场景需要用到,点击按钮复制文本到键盘的 ctrl + v粘贴板的功能,于是记录一下自己的实现过程。
【整体思路】获取到某个 input 或者 textarea 的 dom后, 选中当前 dom, 执行浏览器复制命令。
这里有几个点需要注意:
1、dom 必须要input或者 textarea
2、dom 必须是可见的,这里的可见指的是display可见,也就是说hidden和display: none是复制不到的
3、当需要复制的内容不是input或者textarea,可以通过创建一个dom,把相应的值赋值到这个dom后,再进行执行复制命令
另外,在第2点的基础上,如果这个dom实际上我们并不想它展示在用户的面前,可以使用定位的方式,隐藏到所有元素的最底层。
示例:
let dom = document.getElementById(id)dom.select()document.execCommand('Copy')
php-cli,php 命令行运行模式参数传递
PHP 命令行运行模式参数传递
传递给脚本的参数可以在全局变量 $argv 中获取。
全局变量 $argc 表示 $argv 数组中的元素个数。
示例:
php index.php a b
上述例子中,$argv 为以下结构,$argc则是 3
[ 'index.php', 'a', 'b']
slow-array-func-used-in-loop 【 PHP 循环结构中使用数组函数 】
循环里面使用 array 相关函数会导致运行慢,且占用CPU
例如:
$options = [];foreach ($configurationSources as $source) { /* something happens here */ $options = array_merge($options, $source->getOptions());}
以上代码可以优化成:
$options = [];foreach ($configurationSources as $source) { /* something happens here */ $options[] = $source->getOptions(); // <- yes, we'll use a little bit more memory}/* PHP below 5.6 */$options = call_user_func_array('array_merge', $options + [[]] ...
element-ui, el-input 监听回车事件,阻止冒泡
el-form 阻止冒泡
@submit.native.prevent
例子:
<el-form :inline="true" :model="couponSearchForm" class="demo-form-inline" @submit.native.prevent> <el-form-item label="关键词"> <el-input v-model="couponSearchForm.keyword" clearable @clear="resetCouponSearch" placeholder="" @input="autoSearchUserCoupon" ></el-input> </el-form-item> <el-for ...
element el-table 数据源的值改变后,表格不刷新,没有重新渲染
列表查询页面,通常会使用 el-table 进行列表的数据渲染,请求更新触发更新 table 的数据源是可以实现的。
当 el-table 用于属性计算时,比如说 sku 属性计算,这时候可能会出现数据源的值改变后,表格不刷新,没有重新渲染
这时候,可以在table 的 key 上,绑定设置一个动态的值,每次源数据刷新时,刷新 key 值
:key="key"
key 随机生成即可。
key=Math.random()
php-switch case 比较问题
刚好有个朋友在群上提到了这个问题,于是查询手册后总结一下。
错误例子:
上述例子中,会出现比对错误。
1、case 比对用的是松散比较。2、case 求值后,都为true 或者false
当 $num = 0 时, 0 和 false 松散比较为 true ,于是,会和第二个 case 匹配成功。
【总结】1、case 最好是恒定的情况2、考虑松散比较的问题,最好不要使用1 和 ‘1’ 这种简单的比对