- 论坛徽章:
- 0
|
本帖最后由 starzhestarzhe 于 2010-10-02 16:59 编辑
一.在一组数中,插入一个新数,并维护原来的排序方式不变- /**
- * 在一组数中,插入一个新数,并维护原来的排序方式不变
- * @param array $array
- * @param unknown_type $val
- */
- function pushByOrder(array $array,$val) {
- if(count($array) == 0) { //一个空数组
- return array($val);
- }
- elseif(count($array) == 1) { //数组只一个元素
- $array[] = $val;
- return $array;
- }
- $asc = null; //排序方式
- $end = end($array); //获取数组最后一个元素
- $start = reset($array); //重置数组内部指针并获取第一个元素值
- if($start < $end) {
- $asc = true;
- }
- elseif($start > $end) {
- $asc = false;
- }
- else {
- $array[] = $val;
- return $array;
- }
- $return = array();
- $insert = false; //是否已经插入的标记
- foreach ($array AS $value) { //$array循环一次
- if($insert === false) {
- if($asc) {
- if($value > $val){
- $insert = true;
- }
- }
- else {
- if($value < $val){
- $insert = true;
- }
- }
- if($insert === true) {
- $return[] = $val;
- }
- }
- $return[] = $value;
- }
- if($insert === false) $return[] = $val; //放到最后
- return $return;
- }
- $array = array(
- 'stop'=>9,
- 0=>7,
- 'class'=>2,
- 2=>1,
- 'dygod'=>0,
- '1'=>-5
- );
- print_r($array);
- $array = pushByOrder($array,-9);
- print_r($array);
- //输出
- Array
- (
- [stop] => 9
- [0] => 7
- [class] => 2
- [2] => 1
- [dygod] => 0
- [1] => -5
- )
- Array
- (
- [0] => 9
- [1] => 7
- [2] => 2
- [3] => 1
- [4] => 0
- [5] => -5
- [6] => -9
- )
复制代码 二. 二分法查找- /**
- * 二分法查找
- * @param $array 在数组$array里查找
- * @param $value 要查找的值
- * @param $low 查找起始位置
- * @param $high 查找结束位置
- */
- function binSearch(array &$array,$value,$low,$high) {
- if($low<=$high) {
- $mid=intval(($low+$high)/2);
- if($array[$mid] == $value) {
- return $mid;//返回位置
- }
- elseif($array[$mid] > $value) {
- return binSearch($array,$value,$low,$mid-1); //递归查找
- }
- else {
- return binSearch($array,$value,$mid+1,$high);
- }
- }
- return -1;//查找不到返回-1
- }
- $array = array(0,2,3,5,6,9);
- echo binSearch($array,9,0,count($array)-1);
- 输出:5
复制代码 三.打印一个杨辉三角- /**
- * 杨辉三角形
- * @param $num 行数
- */
- function echoTriangle($num) {
- $oldArray = array(0=>1);
- $newArray = array();
- for($i=0;$i<$num;++$i) {
- $newArray && $oldArray = $newArray;
- $newArray = array();//重置$newArray;
- for($j=0;$j<=$i;++$j) {
- $newArray[$j] = (isset($oldArray[$j-1])?$oldArray[$j-1]:0)+(isset($oldArray[$j])?$oldArray[$j]:0);
- echo $newArray[$j],"\t";
- }
- echo "\n";
- }
- }
- echoTriangle(6);
- //输出
- 1
- 1 1
- 1 2 1
- 1 3 3 1
- 1 4 6 4 1
- 1 5 10 10 5 1
复制代码 四.使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组
- /**
- * 冒泡排序ASC
- * @param 排序数组
- */
- function bubbleSort(array &$array) {
- if(!($count = count($array))) return;
- for ($i=$count-1;$i>0;--$i) {
- for ($j=0;$j<$i;++$j) {
- if($array[$j]>$array[$j+1]) {
- $temp = $array[$j];
- $array[$j] = $array[$j+1];
- $array[$j+1] = $temp;
- }
- }
- }
- }
- $array = array(3,35,6,3246,66,26,236326,6);
- bubbleSort($array);
- print_r($array);
- //输出
- Array
- (
- [0] => 3
- [1] => 6
- [2] => 6
- [3] => 26
- [4] => 35
- [5] => 66
- [6] => 3246
- [7] => 236326
- )
复制代码 五.写一个二维数组排序函数,能够具有通用性
- /**
- * 二维数组按照某个键值做ASC排序
- * @param $array 排序数组
- * @param $sortKey 排序键值
- */
- function DsortArray(array $array,$sortKey) {
- $keyMap = $return = array();
- foreach ($array AS $key=>$data) {
- $keyMap[$key] = $data[$sortKey];
- }
- asort($keyMap);
- foreach($keyMap as $key=>$value){
- $return[] = $array[$key];
- }
- return $return;
- }
- $array = array(
- array('sort'=>12,'name'=>14),
- array('sort'=>3,'name'=>14),
- array('sort'=>5,'name'=>14),
- array('sort'=>1,'name'=>14),
- array('sort'=>7,'name'=>14),
- );
- $array = DsortArray($array,'sort');
- print_r($array);
- //输出
- Array
- (
- [0] => Array
- (
- [sort] => 1
- [name] => 14
- )
- [1] => Array
- (
- [sort] => 3
- [name] => 14
- )
- [2] => Array
- (
- [sort] => 5
- [name] => 14
- )
- [3] => Array
- (
- [sort] => 7
- [name] => 14
- )
- [4] => Array
- (
- [sort] => 12
- [name] => 14
- )
- )
复制代码 六.写一个function实现数组内每个元素之间加法的递代运算?
- /**
- * 数组内每个元素之间加法的递代运算
- * @param array $array 运算数组
- */
- function eachAddInArray(array $array) {
- $return = $keyArray = array();
- $keyArray = array_keys($array);//储存所有key值
- reset($array);
- $i = 0;
- while (($current=current($array)) !== false) {
- foreach ($keyArray AS $key) {
- $return[$i][] = $current+$array[$key];
- }
- array_shift($keyArray); //在key数组中删除已经计算过的key
- next($array);
- ++$i;
- }
- return $return;
- }
- $array = array(1,'s'=>2,'g'=>3);
- $array = eachAddInArray($array);
- print_r($array);
- 输出:
- Array
- (
- [0] => Array
- (
- [0] => 2
- [1] => 3
- [2] => 4
- )
- [1] => Array
- (
- [0] => 4
- [1] => 5
- )
- [2] => Array
- (
- [0] => 6
- )
- )
复制代码 七.设有n 种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n 种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。- /**
- * 设有n 种物品,每种物品有一个重量及一个价值。
- * 但每种物品的数量是无限的,同时有一个背包,最大载重量为M,
- * 从n 种物品中选取若干件(同一种物品可以多次选取),
- * 使其重量的和小于等于M,而价值的和为最大
- * @param $weights 物品重量数组
- * @param $values 物品价值数组
- * @param $weight 包能承受的最大重量
- */
- function optimalValue(array $weights,array $values,$weight) {
- $valueStore = array_fill(1,$weight,0); //价值总量数组,从0-weight初始化为0
- for($i=0;$i<count($weights);++$i) { //完全背包问题解决算法
- for($j=$weights[$i];$j<=$weight;++$j) {
- if($valueStore[$j]<$valueStore[$j-$weights[$i]]+$values[$i]) {
- $valueStore[$j] = $valueStore[$j-$weights[$i]]+$values[$i];
- }
- }
- }
- return $valueStore[$weight]!==0?$valueStore[$weight]:'can\'t get';
- }
- $weight = array(1,2,3,4);
- $value = array(5,7,9,10);
- $return = optimalValue($weight,$value,4);
- echo 'Maximum value:',$return;
- 输出:
- Maximum value:20
复制代码 九.一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。售货员希望用数目最少的硬币个数找给小孩。假设提供了数目不限的面值为2 5美分、1 0美分、5美分、及1美分的硬币,写一个算法让售货员用最少的硬币个数找给小孩- /**
- * 让售货员用最少的硬币个数找给小孩的算法
- * @param $money
- * @return 以美分为key数量为value的数组返回
- */
- function giveCents($money) {
- $m = array(25,10,1,5);
- $give = 100 - $money;
- rsort($m);//所有美分从大到小排序
- $return = array();
-
- foreach ($m AS $v) {
- $return[$v] = floor($give/$v);
- if($return[$v] > 0) {
- $give = $give%$v;
- }
- if($give<=0) break;
- }
- return $return;
- }
- $money = 23;
- $return = giveCents($money);
- print_r($return);
- 输出:
- Array
- (
- [25] => 3
- [10] => 0
- [5] => 0
- [1] => 2
- )
复制代码 十一.公鸡3元每只,母鸡5元每只,小鸡1元3只,一百元钱买一百只鸡。请求出公鸡,母鸡和小鸡的数目。- /**
- * 公鸡3元每只,母鸡5元每只,小鸡1元3只,一百元钱买一百只鸡。请求出公鸡,母鸡和小鸡的数目
- */
- function echoChicken() {
- $chicken=100;
- $mNum = floor(100/3);
- $wNum = floor(100/5);
- $cNum = 300;
- $total = $m = 0;
- for ($i=1;$i<$mNum;++$i){
- for ($j=1;$j<$wNum;++$j){
- for ($k=1;$k<$cNum;++$k){
- $m = 3*$i+5*$j+$k/3;
- $total = $i+$j+$k;
- if ($m == 100 &&$total == $chicken){ //根据数量和money
- echo '公鸡:',$i,"\n",'母鸡:',$j,"\n",'小鸡:',$k,"\n";
- }
- }
- }
- }
- }
- echoChicken();
- //输出:
- 公鸡:4
- 母鸡:12
- 小鸡:84
- 公鸡:11
- 母鸡:8
- 小鸡:81
- 公鸡:18
- 母鸡:4
- 小鸡:78
复制代码 十二.小猴第一天摘下若干枣子,当即吃掉了一半,不过瘾又多吃了一个;第二天吃了剩下的一半又多吃了一个;以后每一天都吃了前一天剩下的一半多一个。到第十天小猴再想吃时,见到只剩下一只枣子了。问第一天这堆枣子有多少?- /**
- * 第一天这堆枣子有多少
- */
- function calDates($n) {
- if($n<10) {
- return 2*(calDates($n+1)+1); //递归式
- }
- return 1;
- }
- echo "第一天有",calDates(1),"个\n";
- //输出:
- 第一天有1534个
复制代码 十五. JS下有一个字符串var str = '1|2|3|4|5|6#1|2|3|4#1|2|3|4|5|6|7|8'; 请用“#”号将其分割为数组,再用“|”将其分割为2维数组。可以用例如ary[0][0]这样的各式取出数组中的每个元素。最后输出其中最长数组的编号(1,2,3这样的自然数),这个数组中元素的个数。以及大数组中每个元素- <script type="text/javascript">
- var str = '1|2|3|4|5|6#1|2|3|4#1|2|3|4|5|6|7|8';
- var array = str.split('#');
- var returnArray = new Array();
- for(var i=0;i<array.length;++i) {
- var newArray = array[i].split('|');
- returnArray[i] = newArray;
- }
- var most = 0;
- var mosti = 0;
- var key = null;
- var html = null;
- for(var i=0;i<returnArray.length;++i) {
- if(returnArray[i].length > most) {
- most = returnArray[i].lenght;
- mosti = i+1;
- }
- }
- html = '最长的数组编号为:'+mosti+"\n";
- html+='长度为:'+most+"\n";
- for(key in returnArray[mosti-1]) {
- html+=returnArray[mosti-1][key]+',';
- }
- document.write(html);
- </script>
- //输出:
- 最长的数组编号为:3
- 长度为:8
- 1,2,3,4,5,6,7,8,
复制代码 十六.假设数据库中有两个表table1和table2,(太那什么了,过...){:3_196:}
十七.有一个数组array('a','b','c','d','e','f'),请使用两段代码分别达成图1和图2中的效果。- /**
- * 第一种
- * @param $array
- */
- function result1($array) {
- $array1 = $array2 = $arrayTemp = array();
- $end = end($array);
- $start = true;
- while(($current = current($array)) !== false) {//逆向循环数组
- if($start) {
- $start = false;
- $arrayTemp[prev($array)] = $end;
- }
- elseif(($pre = prev($array)) !== false) {
- $array1 = $arrayTemp;
- $arrayTemp = array();//清空$arrayTemp
- $arrayTemp[$pre] = $array1;
- }
- }
- print_r($arrayTemp); //输出array1;
- }
- /**
- * 第二种
- * @param $array
- */
- function result2($array) {
- $array1 = $array2 = $arrayTemp = array();
- $end = end($array);
- $start = true;
- while(($current = current($array)) !== false) {//逆向循环数组
- if($start) {
- $start = false;
- $arrayTemp[prev($array)] = array($end=>'Value');
- }
- elseif(($pre = prev($array)) !== false) {
- $array1 = $arrayTemp;
- $arrayTemp = array();//清空$arrayTemp
- $arrayTemp[$pre] = $array1;
- }
- }
- print_r($arrayTemp); //输出array1;
- }
- $array = array('a','b','c','d','e','f');
- result1($array);
- result2($array);
- //输出:
- Array
- (
- [a] => Array
- (
- [b] => Array
- (
- [c] => Array
- (
- [d] => Array
- (
- [e] => f
- )
- )
- )
- )
- )
- Array
- (
- [a] => Array
- (
- [b] => Array
- (
- [c] => Array
- (
- [d] => Array
- (
- [e] => Array
- (
- [f] => Value
- )
- )
- )
- )
- )
- )
复制代码 十八.请使用一句话将类似“1910-09-09”的日期各式转换为“一九一零年九月九日”这样的各式- $date = '1910-09-09';
- echo str_replace(
- array(0,1,2,3,4,5,6,7,8,9),
- array('零','一','二','三','四','五','六','七','八','九'),
- date('Y年n月j日',strtotime($date))
- );
- //输出:
- 一九一零年九月九日
复制代码 二十.简述如何得到当前执行脚本路径,包括所得到参数。- function getScriptAndArg() {
- $return = $_SERVER['SCRIPT_FILENAME'];
- $q = false;
- if($_SERVER['QUERY_STRING']) {
- $q = true;
- $return.='?'.$_SERVER['QUERY_STRING'];
- }
- if($_POST) {
- $return = $q?($return.'&'):($return.'?');
- $return.= implode('&',$_POST);
- }
- return $return;
- }
- echo getScriptAndArg();
复制代码 二十一.写出一个能创建多级目录的PHP函数- function mkRDir($dir) {
- if(!is_dir($dir)) {
- mkRDir(dirname($dir));
- mkdir($dir, 0777);
- }
- }
- $dir='/var/www/starzhe.com/tt/dd/cc/rr';
- mkRDir($dir);
复制代码 二十二.有一个留言板,用mysql做数据库,用户信息包括:用户名,密码,email,留言内容包括:留言ID,标题,内容,发表时间,状态(审核,未审核),请实现下列需求- 用户表:(user)
- id 用户id int(11) 主键
- name 姓名 varchar(30) 唯一索引
- password 密码 char(32)
- email 邮箱 varchar(30) 唯一索引
- 留言表: (book)
- id 留言id int(11) 主键
- user_id 留言用户id int(11) 普通索引
- subject 标题 varchar(100)
- status 状态 tinyint(1) 普通索引
- time 发表时间 int(11) 普通索引
- 留言内容表: (book_detail)
- book_id 留言id int(11) 主键
- content 留言内容 test
- SELECT u.name,COUNT(b.id) AS book_count FROM user AS u LEFT JOIN book AS b ON(b.user_id=u.id) GROUP BY b.user_id HAVING COUNT(b.id)>10 ORDER BY book_count DESC
复制代码 二十三.写出php的public、protected、private三种访问控制模式的区别- 声明为public的属性或方法可以在任何地方访问和调用
- 声明为private的属性或方法只能在该类的内部访问和调用
- 声明为protected的属性或方法只能在该类的内部和该类的继承类内部访问和调用
复制代码 二十四. 给你三个数,写程序求出其最大值- function getMaxNumber($a,$b,$c) {
- return (($a = ($a<$b)?$b:$a)<$c)?$c:$a;
- }
- echo getMaxNumber(9,2,4);
- //输出:
- 9
复制代码 二十五.写出查询发贴数最多的十个人名字的SQL,利用下表:members(id,username,posts,pass,email)- SELECT username FROM `members` ORDER BY `posts` DESC LIMIT 10
复制代码 二十七.有一数组 $a=array(4,3,8,9,2);请将其重新排序(按从小到大的顺序列出)。- $array = array(4,3,8,9,2);
- sort($array);
- print_r($array);
- //输出
- Array
- (
- [0] => 2
- [1] => 3
- [2] => 4
- [3] => 8
- [4] => 9
- )
复制代码 二十八.写出匹配邮箱地址和URL的两个正则表达式。类似下面的:
邮箱地址:user_name.first@hztraining.com
URL地址:http://www.hztraining.com/user_profile.php?uid=100- $urlRe = '/^(?:http|https):\/\/\w[\w-]*(?:\.[\w-]+)*(?:\/[\w-\.]*)*(?:\?(?:[\w-]+=[\w-]+&?)*)*/';
- $emailRe = '/^\w[\w-\.]*@(?:[^@]+)$/';
复制代码 二十九.对于大流量的网站,您采用什么样的方法来解决访问量问题- //增加硬件投入
- //页面静态化
- //优化缓存
- //数据库优化
- //代码优化
复制代码 三十.MySQL数据库,一天一万条以上的增量,怎么优化- //存储引擎优化,对于日志表这种写多读少的需要特点,采用innodb引擎,对于读频率远大于写的采用myisam引擎
- //优化索引
- //采取合适的分库分表策略
- //分离冷热数据
复制代码 三十一.写个函数来解决多线程同时读写一个文件的问题。
- //C/C++实现的话用读写锁
- //PS:PHP不支持线程多
- //要实现的话:
- //程序运行生成一个锁标志的文件,读写时判断是否存在,存在退出, 不存在继续执行, 并生成一个锁文件, 程序结束删除此锁文件
复制代码 三十三.写一个函数,算出两个文件的相对路径
如 $a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
计算出 $b 相对于 $a 的相对路径应该是 ../../c/d将()添上- function getRelativePath($path1,$path2) {
- $p1 = explode('/',$path1);
- $p2 = explode('/',$path2);
- $path = null;
- $count1 = count($p1);
- $count2 = count($p2);
- foreach ($p2 AS $key=>$value) {
- if($p1[$key] !== $p2[$key]) { //查找路径不同的开始位置
- break;
- }
- }
- $path = str_repeat('../',$count2-$key-1); //获得从不同开始处到文件2深度
- $i = $key;
- while(1) { //从不同开始处到文件1目录
- $path.=$p1[$i];
- ++$i;
- if($i == $count1-1) break;
- $path.='/';
- }
- return $path;
- }
- $path1 = '/a/b/c/d/e.php';
- $path2 = '/a/b/12/34/c.php';
- echo getRelativePath($path1,$path2);
- //输出:
- ../../c/d
复制代码 |
|