- 论坛徽章:
- 59
|
本帖最后由 renxiao2003 于 2010-10-11 21:19 编辑
先占个位。十一回家答题去。
为了体现每个题的时间,我都单独发一个帖子,然后汇总到这个帖子里。由于6#汇总了几个帖子,但是怕总在六楼更新体现不出原来几个题的时间,所以不再更新六楼,这个楼层作为我所有答题的汇总。
1:要求在一组数中,插入一个新数,并维护原来的排序方式不变http://bbs.chinaunix.net/redirec ... 788191&pid=12898841- <?php
- //1:要求在一组数中,插入一个新数,并维护原来的排序方式不变
- function insertArr($arr,$val){
- $pos=0;
- if (sizeof($arr)==0) return array($val); //传入数组没有值
- if (sizeof($arr)==1){ //传入数组个数为1
- return array($val,$arr[0]);
- }
- $bfind=false;
- if ($arr[0]>$arr[sizeof($arr) - 1]){
- $bfind=true; //从大到小排序
- }else{
- $bfind=false;//从小到大排序
- }
- for($i=0;$i<sizeof($arr);$i++){ //找到要插入值应该插入的位置。
- if ($bfind){
- if ($arr[$i]<$val){
- $pos=$i;
- break;
- }
- }else{
- if ($arr[$i]>$val){
- $pos=$i;
- break;
- }
- }
- }
- $left_arr=array();
- $right_arr=array();
- for ($i=0;$i<sizeof($arr);$i++){ //根据要插入的值把数组分左右两部分。
- if ($i<$pos){
- $left_arr[]=$arr[$i];
- }else{
- $right_arr[]=$arr[$i];
- }
- }
- return array_merge($left_arr,array($val),$right_arr);
- }
- //测试
- $arr=array();
- print_r(insertArr($arr,10));echo "<br>";
- $arr=array(1);
- print_r(insertArr($arr,10));echo "<br>";
- $arr=array(1,3,8,12,13,15);
- print_r(insertArr($arr,10));echo "<br>";
- $arr=array(31,23,18,12,11,1);
- print_r(insertArr($arr,10));echo "<br>";
- ?>
复制代码 2:用二分法在一个数组中查找你所需元素http://bbs.chinaunix.net/redirec ... 788191&pid=12898685- <?php
- //二分法
- function binarySearch($a, $val){
- $low = 0;
- $high= count($a) - 1;
- while($low <= $high){
- $mid = intval(($low+$high)/2);
- if($a[$mid] == $val) return $mid; //找到相等的就返回所在的位置
- if($a[$mid] > $val){ //要查找的在前半截
- $high = $mid - 1;
- }else{
- $low = $mid + 1; //要查找的在后半截
- }
- }
- return -1;
- }
- //测试
- $arr=array(1,3,6,8,10);
- echo binarySearch($arr,3); //数组从0开始,故返回值是1
- ?>
复制代码 3:打印一个杨辉三角 http://bbs.chinaunix.net/redirec ... 788191&pid=12883362
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1- <?php
- /**=============================
- * 功能:生成杨辉三角数组。
- * 参数:$num 要生成的列数。
- */
- function generationYanghui($num){
- $arr=array();
- for ($i=0;$i<$num;$i++){
- $arr[$i]=array();
- //第一行和第二行均为1
- if ($i==0){
- $arr[$i][0]=1;
- continue;
- }
- if ($i==1){
- $arr[$i][0]=1;
- $arr[$i][1]=1;
- continue;
- }
- //从第三行开始,第一个和最后一个为1,
- //第二个喂上一行的前一个位置的值和本位置的值的和。
- for ($j=0;$j<=$i;$j++){
- if ($j==0){
- $arr[$i][$j]=1;
- continue;
- }
- if ($j==$i){
- $arr[$i][$j]=1;
- continue;
- }
- $arr[$i][$j]=$arr[$i-1][$j-1]+$arr[$i-1][$j];
- }
- }
- return $arr;
- }
- //测试生成并打印出杨辉参数
- $num=6;
- $arrYH = generationYanghui($num);
-
- for ($i=0;$i<sizeof($arrYH);$i++){
- for($j=0;$j<sizeof($arrYH[$i]);$j++){
- echo $arrYH[$i][$j] . " " ;
- }
- echo "<Br>";
- }
- ?>
复制代码 4:使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组
http://bbs.chinaunix.net/redirec ... 788191&pid=12893006
冒泡排序算法:- <?php
- //冒泡排序(一维数组)
- function bubble_sort($arr){
- $count = count($arr);
- if ($count <= 0) return false;
- for($i=0; $i<$count; $i++){
- for($j=$count-1; $j>$i; $j--){
- if ($arr[$j] < $arr[$j-1]){
- $tmp = $arr[$j];
- $arr[$j] = $arr[$j-1];
- $arr[$j-1] = $tmp;
- }
- } }
- return $arr;
- }
- //使用实例
- $_array = array('5', '8' ,'5' ,'6' ,'9' ,'3' ,'2' ,'4');
- $_array = bubble_sort($_array);
- print_r ($_array);
- ?>
复制代码 快速排序算法:- <?php
- function quick_sort($arr){
- if(count($arr)<=1){
- return $arr;
- }
- $key=$arr[0];
- $left_arr=array();
- $right_arr=array();
- for($i=1;$i<count($arr);$i++){
- if($arr[$i]<=$key){
- $left_arr[]=$arr[$i];
- }else{
- $right_arr[]=$arr[$i];
- }
- }
- $left_arr=quick_sort($left_arr);
- $right_arr=quick_sort($right_arr);
- return array_merge($left_arr,array($key),$right_arr);
- }
- //使用实例
- $_array = array('5', '8' ,'5' ,'6' ,'9' ,'3' ,'2' ,'4');
- $_array = quick_sort($_array);
- print_r ($_array);
- ?>
复制代码 5:写一个二维数组排序函数,能够具有通用性 http://bbs.chinaunix.net/redirec ... 788191&pid=12942807- /**
- * 参数1 array 待排序的苏组
- * 参数2 string 第一项排序关键字
- * 参数3 string 排序方法,升序还是降序("SORT_ASC"|"SORT_DESC")
- * 参数4 string 排序类型,值有("SORT_REGULAR"|"SORT_NUMERIC"|"SORT_STRING")
- * 返回值 array 排序后的数组
- */
- function MultiArraySort($ArrayData,$KeyName1,$SortOrder1 = "SORT_ASC",$SortType1 = "SORT_REGULAR")
- {
- if(!is_array($ArrayData))
- {
- return $ArrayData;
- }
- // Get args number.
- $ArgCount = func_num_args();
- // Get keys to sort by and put them to SortRule array.
- for($I = 1;$I < $ArgCount;$I ++)
- {
- $Arg = func_get_arg($I);
- if(!eregi("SORT",$Arg))
- {
- $KeyNameList[] = $Arg;
- $SortRule[] = '$'.$Arg;
- }
- else
- {
- $SortRule[] = $Arg;
- }
- }
- // Get the values according to the keys and put them to array.
- foreach($ArrayData AS $Key => $Info)
- {
- foreach($KeyNameList AS $KeyName)
- {
- ${$KeyName}[$Key] = $Info[$KeyName];
- }
- }
- // Create the eval string and eval it.
- $EvalString = 'array_multisort('.join(",",$SortRule).',$ArrayData);';
- eval ($EvalString);
- return $ArrayData;
- }
复制代码 6:写一个function实现数组内每个元素之间加法的递代运算?http://bbs.chinaunix.net/redirec ... 788191&pid=12890913
注:数组元素全部为自然数.
例:
$data=array(1,2,3);
程序要求打印出数组每个数组元素相互之间各种可能性加法(包括元素自已本身加法)
1+1=2,1+2=3,1+3=5,
2+2=4,2+3=5,
3+3=6
打印出以下结果
Array
(
[0] => Array
(
[0] => 2
[1] => 3
[2] => 4
)
[1] => Array
(
[1] => 4
[2] => 5
)
[2] => Array
(
[2] => 6
)
)- <?php
- function addArr($data){
- $arr=array();
- for ($i=0;$i<sizeof($data);$i++){
- $arr[$i][0]=$data[$i]+$data[$i];
- for($j=$i+1;$j<sizeof($data);$j++){
- $arr[$i][$j]=$data[$i]+$data[$j];
- }
- }
- print_r($arr);
- }
- $data=array(1,2,3);
- addArr($data);
- ?>
复制代码 7:设有n 种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n 种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。http://bbs.chinaunix.net/redirec ... 788191&pid=12943300- <?php
- /*
- 设有n 种物品,每种物品有一个重量及一个价值。但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n 种物品中选取若干件(同一种物品可以多次选取),使其重量的和小于等于M,而价值的和为最大。
- Input
- 第一行:两个整数,M(背包容量,M<= 200)和N(物品数量,N<= 30); 第2..N+1 行:每行二个整数Wi,Ui,表示每个物品的重量和价值。
- Output
- 仅一行,一个数,表示最大总价值。
- Sample Input
- 12 4
- 2 1
- 3 3
- 4 5
- 7 9
- Sample Output
- 15
- */
- set_time_limit(30);
- define(’NOWTIME’,time());
- function microtime_float()
- {
- list($usec, $sec) = explode(" ", microtime());
- $sec=$sec-NOWTIME;
- return ((float)$usec + (float)$sec);
- }
- //初始化数组
- /*
- $bbw=12;
- $arywp=array();
- $arywp[]=array(’d',2,1);
- $arywp[]=array(’c',3,3);
- $arywp[]=array(’b',4,5);
- $arywp[]=array(’a',7,9);
- */
- $time_start = microtime_float();
- //开始计算
- $wpnum=count($arywp);
- $wpnum=20; //允许的物品类型数量
- $bbw=rand(5*$wpnum,50*$wpnum); //背包允许最大重量
- for($i1=0;$i1<$wpnum;$i1++){ //初始化每个物品类型的重量和价值
- $arywp[$i1][0]="w".$i1; //名称
- $arywp[$i1][1]=rand(50,80); //重量
- $arywp[$i1][2]=rand(20,50); //价值
- $arywp[$i1][3]=$arywp[$i1][2]/$arywp[$i1][1];//单位重量的最大价值
- }
- function cmp($a, $b){
- $returnvalue=0;
- if ($a[3] == $b[3]) {
- $returnvalue= 0;
- } else {
- $returnvalue = ($a[3] > $b[3]) ? -1 : 1;
- }
- return $returnvalue;
- }
- //按单位最大价值排序
- usort($arywp, "cmp");
- print_r($arywp);
- echo " <br />\n";
- //递归函数,计算剩余空间的允许物品最大价值
- function getmaxval($bbw,$arywp){
- //最大单位物品的重量、价值、数量
- $use_w=0;
- $use_v=0;
- $ary_userwp=array();
- //当前空间的允许物品最大价值
- $maxwgt=0;
- $maxval=0;
- $maxuserwp=array();
- $wp = array_shift($arywp);
- $num= floor(($bbw-$use_w)/$wp[1]); //最大单位物品的最大允许个数
- //echo " countmax : $num * ".$wp[0]."<br/>\n";
- if(count($arywp)==0 || $bbw-$use_w==$wp[1]*$num){ //没有剩余物品或刚好填满 //递归结束条件
- if($num>0){
- $maxwgt+=$wp[1]*$num;
- $maxval+=$wp[2]*$num;
- $maxuserwp[$wp[0]]=$num;
- }
- } else {
- for($i=0;$i<=$num;$i++){ //计算最大单位物品不同数量时的最大价值
- $use_w=$wp[1]*$i;
- $use_v=$wp[2]*$i;
- $ary_userwp[$wp[0]]=$i;
- if(($num-$i)*$wp[2]/($bbw-$use_w) < $arywp[0][3]){ //剩余空间的单位价值小于下件物品的单位价值
- list($subuse_w,$subuse_v,$subusewp)=getmaxval($bbw-$use_w,$arywp);
- } else {
- $subuse_w=0;
- $subuse_v=0;
- $subusewp=array();
- }
- if($use_v+$subuse_v>$maxval || $maxval==0){ //比较最大价值
- $maxwgt=$use_w+$subuse_w;
- $maxval=$use_v+$subuse_v;
- if($i>0){
- $maxuserwp=array_merge($ary_userwp,$subusewp);
- } else{
- $maxuserwp=$subusewp;
- }
- }
- }
- //print_r($maxuserwp);
- //echo " maxwgt : $maxwgt maxval : $maxval<br/>\n";
- }
- //返回 使用的重量,最大价值、使用的物品数量数组
- return array($maxwgt,$maxval, $maxuserwp);
- }
- //开始计算
- $arysulte= getmaxval($bbw,$arywp);
- //输出结果
- echo " bbw ".$bbw." ";
- print_r($arysulte);
- $time_end = microtime_float();
- $runtime = $time_end – $time_start;
- echo " runtime : ".$runtime;
- ?>
复制代码 8:设随机抽到A的概率为0.1,B的概率为0.2,C的概率为0.3,D的概率为0.4,现在求按此概率随机抽出一个字母的算法,http://bbs.chinaunix.net/redirec ... 788191&pid=12943384- <?php
- /**
- * 根据概率取随机数的算法(仅抽取1个)
- * 用法:
- * $proArr = array(10,20,30,40);
- * $result = pro_rand($proArr);
- * echo '你抽到的$proArr数组索引是'. $result. ',其预设概率数是'. $proArr[$result];
- ** @param array $proArr 概率数组。格式为array('A'=>10, 'B'=>40, 'C'=>50),或者array(10,40,50)。数组的每个键值(value)必须为大于1的整数;所有数组键值(value)加起来即为其总概率精度
- * @return mixed $result 结果,将返回抽取到的概率数组索引值。
- */
- function pro_rand( $proArr ){
- $result = '';
- //概率数组的总概率精度
- $proSum = array_sum($proArr);
-
- foreach ( $proArr as $key => $proCur ){
- $randNum = mt_rand(1, $proSum);
- if( $randNum <= $proCur ){
- $result = $key;
- break;
- }else{
- $proSum -= $proCur;
- }
- }
-
- return $result;
-
- }
- ?>
复制代码 9:一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。售货员希望用数目最少的硬币个数找给小孩。假设提供了数目不限的面值为2 5美分、1 0美分、5美分、及1美分的硬币,写一个算法让售货员用最少的硬币个数找给小孩 http://bbs.chinaunix.net/redirec ... 91&pid=12964560- <?php
- /**
- * 程序说明:总钱数和花去的钱数可以修改,也可以从页面的输入获取。修改相应的值就可以。
- * 这里直接写的值,如果从页面获取可以用$_POST['totalmoney']或者$_GET['totalmoney']
- * 这样的方式从提交页面获取总钱数和花去的钱数。
- * 最后通过计算后,用echo将结果输出到页面。
- */
- $totalmoney=100; //总钱数(美分)
- $consumemoney=11; //花去的钱
- $complet=false; //找钱完成
- $change=0;
- //找零25,10,5,1美分钱的个数
- $ch25 = 0;
- $ch10 = 0;
- $ch5 = 0;
- $ch1 = 0;
- for(;;){
- if ($complet) break;
- $left=$totalmoney - $consumemoney - $change; //还没有找的钱
- if ($left <= 0) {
- $complet = true;
- }else{
- if ($left >= 25){ //找25美分钱
- $change = $change + 25;
- $ch25 = $ch25 + 1;
- }else if ($left >= 10 ){//找10美分钱
- $change = $change + 10;
- $ch10 = $ch10 + 1;
- }else if ($left >= 5){//找5美分钱
- $change = $change + 5;
- $ch5 = $ch5 + 1;
- }else{//找1美分钱
- $change = $change + 1;
- $ch1 = $ch1 + 1;
- }
- }
- }
- echo "剩余零钱 " . ($totalmoney - $consumemoney) . " 美分.<br>";
- echo "找25美分 " . $ch25 . " 个。<br>";
- echo "找10美分 " . $ch10 . " 个。<br>";
- echo "找 5美分 " . $ch5 . " 个。<br>";
- echo "找 1美分 " . $ch1 . " 个。<br>";
- ?>
复制代码 10:五只猴子采得一堆桃子,猴子彼此约定隔天早起后再分食。不过,就在半夜里,一只猴子偷偷起来,把桃子均分成五堆后,发现还多一个,它吃掉这桃子,并拿走了其中一堆。第二只猴子醒来,又把桃子均分成五堆后,还是多了一个,它也吃掉这个桃子,并拿走了其中一堆。第三只,第四只,第五只猴子都依次如此分食桃子。那么桃子数最少应该有几个呢? http://bbs.chinaunix.net/redirec ... 91&pid=12961390- <?php
- echo "start";
- for ($y=16;;$y+=4){
- if (($y-1)%5!=0) continue;
- $x=$y;
- for ($i=4;$i>=1&&$x%4==0;$i--){
- $x=($x/4)*5+1;
- }
- if ($i==0){
- echo "桃子最少应该有:" . $x;
- break;
- }
- }
- ?>
复制代码 11:公鸡3元每只,母鸡5元每只,小鸡1元3只,一百元钱买一百只鸡。请求出公鸡,母鸡和小鸡的数目。http://bbs.chinaunix.net/redirec ... 788191&pid=12896680- <?php
- //11:公鸡3元每只,母鸡5元每只,小鸡1元3只,一百元钱买一百只鸡。请求出公鸡,母鸡和小鸡的数目。
- $totalmoney=100;
- $totalchicken=100;
- $cocknum = intval($totalmoney/3); //100元全买公鸡的数目
- $hennum = intval($totalmoney/5); //100元全买母鸡的数目
- $biddynum = 100; //100元虽然能买300只小鸡,但因为题意是要买100只鸡。所以小鸡数最大为100
- for ($i=1;$i<$cocknum;$i++){ //公鸡数
- for ($j=1;$j<$hennum;$j++){//母鸡数
- for ($k=1;$k<$biddynum;$k++){//小鸡数
- $money = $i * 3 + $j * 5 + $k / 3;
- $total = $i + $j + $k;
- if (($money == $totalmoney) &&($total == $totalchicken)){
- echo "公鸡:" . $i . "只,母鸡:" . $j ."只,小鸡:" . $k ."只。<Br>";
- }
- }
- }
- }
- ?>
复制代码 12:小猴第一天摘下若干枣子,当即吃掉了一半,不过瘾又多吃了一个;第二天吃了剩下的一半又多吃了一个;以后每一天都吃了前一天剩下的一半多一个。到第十天小猴再想吃时,见到只剩下一只枣子了。问第一天这堆枣子有多少?http://bbs.chinaunix.net/redirec ... 788191&pid=12893429- <?php
- //采用倒推算法。
- function getTotal($day){
- $total=0;
- if ($day==1){ //第一天只有一个
- $total = 1;
- }else{ //以后每一天为前一天的两加上1个。
- $total = 2*(getTotal($day-1)+1);
- }
- return $total;
- }
- //测试
- echo getTotal(10);
- ?>
复制代码 13:有一艘大船准备用来装载货物。所有待装货物都装在货箱中且所有货箱的大小都一样,但货箱的重量都各不相同。设第i 个货箱的重量为wi(1≤i≤n),而货船的最大载重量为c,如何在货船上装入最多的货物。http://bbs.chinaunix.net/redirec ... 91&pid=12968979- <?php
- $arrW=array(1=>W1,2=>W2,.....,n=>Wn); //这个数组存放的是货物的重量(W1,W2,....Wn为具体数值)
- $c = 10000; //总装载量
- function sortArr($arr){
- if (sizeof($arr)<2) return $arr;
- //先将货物从轻到重排序。
- for ($i=1;$i<=sizeof($arr);$i++){
- for ($j=$i+1;$j<sizeof($arr);$j++){
- if ($arr[$i]>$arr[$j]){
- $temp = $arr[$i];
- $arr[$i] = $arr[j];
- $arr[$j]=$temp;
- }
- }
- }
- return $arr;
- }
- $arrTemp = sortArr($arrW); //排序
- $arrLoad = array();
- $j = 0;
- for ($i = 1;$i<=sizeof($arrTemp);$i++){
- if ($arrTemp[$i] < $c){ //还有可以装载的地方
- foreach ($arrW as $key=>$value){
- if ($value == $arrTemp[$i]){ //找到原始的箱号
- $arrLoad[$j] = $key . ":" . $value;
- break;
- }
- }
- $j = $j + 1;
- $c = $c - $arrTemp[$i]; //总装载量减少
- }else{
- break; //已经没有可以装箱的地方
- }
- }
- print_r($arrLoad); //这就是装箱的结果
- ?>
复制代码 14:小球从10米高处自由下落,每次弹起的高度是下落高度的70%,当小球弹起的高度不足原高度的千分之一时,小球很快会停止跳动,计算小球在整个弹跳过程中所经历的总路程(忽略弹起高度不足原高度千分之一的部分)。http://bbs.chinaunix.net/redirec ... 91&pid=12966183- <?php
- /**
- * 参数:$first 出师下落高度
- * 返回:总路程
- */
- function allLength($first){
- $h = $first; //初始下落高度
- $s = 0; //总路程
- for (;;){
- $l = 0.7 * $h; //弹起高度。
- $s = $s + $h + $l;
- $h = $l; //下次下落高度
- if ($l < ($first / 1000)){ //不足初始高度的1/1000时,退出
- break;
- }
- }
- return $s;
- }
- //测试
- $home = 10;
- $total = allLength($home);
- echo "总路程是:" . $total . "米。";
- ?>
复制代码 15、 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这样的自然数),这个数组中元素的个数。以及大数组中每个元素。如图:
http://bbs.chinaunix.net/redirect.php?goto=findpost&ptid=1788191&pid=12943636- <script language=javascript>
- var str = '1|2|3|4|5|6#1|2|3|4#1|2|3|4|5|6|7|8';
- var arr=str.split("#"); //分割一维数组
- var arrtwo=new Array();
- for(var i=0;i<arr.length;i++){
- arrtwo[i]=arr[i].split("|"); //分割二维数组。
- }
- var maxlength=arrtwo[0].length;
- var maxarr=1;
- //求二维数组最大长度和个数
- for (var i=1;i<arrtwo.length;i++){
- if (maxlength < arrtwo[i].length){
- maxlength = arrtwo[i].length;
- maxarr=i+1;
- }
- }
- document.write("最长的二维数组是:"+maxarr);
- document.write("<br>长度为:" + maxlength);
- //打印数组
- for (var i=0;i<arrtwo.length;i++){
- document.write("<br>");
- for (var j = 0;j<arrtwo[i].length;j++){
- document.write(arrtwo[i][j]+",");
- }
- }
- </script>
复制代码 16、假设数据库中有两个表table1和table2,这两个表结构相同,都有三个字段id、name和description,分别存放编号、名称和描述。
现在请做一个页面,包含两个下拉菜单,第一个下拉菜单内是table1中的name,第二个下拉菜单内是table2中的name。下拉菜单的默认值是无,当选择了table1中的任意一个name时,出现一个textarea框显示name对应的description。当选择了table2中的任意一个name时,出现一个textarea框显示name对应的description,并且保留上一个下拉菜单的值和textarea中的值。Textarea中的值可修改,需要做到修改第一个textarea的值,然后更改第二个下拉菜单的值后,第一个textarea中的修改值仍然保留。最后是一个提交按钮,只有按下提交按钮,才会把textarea中的数据才会存入数据库。如图(图省略):
详细解答见:http://bbs.chinaunix.net/redirec ... 91&pid=12971389
17、有一个数组array('a','b','c','d','e','f'),请使用两段代码分别达成图1和图2中的效果。http://bbs.chinaunix.net/redirec ... 91&pid=12952387
图1:
![]()
图2:
![]()
第一种形式:- <?php
- /**
- * 产生第一种形式数组
- * 参数:数组
- * 返回:数组
- */
- function generateArray1($arr){
- if (sizeof($arr)<2) return $arr; //如果数组个数只有一个或者0个,返回原始值。
- $r_arr=null;
- for ($i=sizeof($arr) - 2;$i>=0;$i--){
- if ($i == sizeof($arr) - 2){
- $r_arr=array($arr[$i]=>$arr[sizeof($arr)-1]);
- }else{
- $r_arr=array($arr[$i]=>$r_arr);
- }
- }
- return $r_arr;
- }
- $test_arr=array('a','b','c','d','e','f');
- print_r(generateArray1($test_arr));
- ?>
复制代码 第二种形式:
- <?php
- /**
- * 产生第二种形式数组
- * 参数:数组
- * 传入的值
- * 返回:数组
- */
- function generateArray2($arr,$value){
- if (sizeof($arr)<1) return $arr; //如果数组个数只有0个,返回原始值。
- $r_arr=null;
- for ($i=sizeof($arr) - 1;$i>=0;$i--){
- if ($i == sizeof($arr) - 1){
- $r_arr=array($arr[$i]=>$value);
- }else{
- $r_arr=array($arr[$i]=>$r_arr);
- }
- }
- return $r_arr;
- }
- $test_arr=array('a','b','c','d','e','f');
- print_r(generateArray2($test_arr,'Value'));
- ?>
复制代码 18、请使用一句话将类似“1910-09-09”的日期各式转换为“一九一零年九月九日”这样的各式。(需要有通用性,是不是一句话不是关键,但不允许使用if\switch\while\for等语句)。http://bbs.chinaunix.net/redirec ... 788191&pid=12877539
使用正则表达式实现- <?php
- function convertNumberToChinese($str){
- //先将-替换成年月日
- $pattern='/(\d+)-(0*)([1-9]+)-(0*)([1-9]+)/';
- $replace='${1}年${3}月${5}日';
- $str= preg_replace($pattern,$replace,$str);
- //再将数字替换成汉字
- $patterns=array("/0/","/1/","/2/","/3/","/4/","/5/","/6/","/7/","/8/","/9/");
- $replaces=array("零","一","二","三","四","五","六","七","八","九");
- $re = preg_replace($patterns,$replaces,$str);
- return $re;
- }
- $str = '1910-09-09';
- echo convertNumberToChinese($str)
- ?>
复制代码 19、有一张表test,包含四个字段id, question, answer,rank里面有1000条数据。要求做一个页面,随机抽取50道题目(都是单选题),分页显示所有的题目,每页显示1题。按钮包含:第一题—上一页—当前第N题—下一页—最后一题。交卷后将每一题的答案和数据库中的标准答案作比较,相同+2分,最后得出成绩存入rank。 (暂时只实现了生产题目的功能。答题和更新还没有实现) http://bbs.chinaunix.net/redirec ... 91&pid=12966508
20、简述如何得到当前执行脚本路径,包括所得到参数。 http://bbs.chinaunix.net/redirec ... 91&pid=12953380
说明:例如有一个脚本www.domain.com,传给他的参数有参数1,参数2,参数3….
传递参数的方法有可能是GET有可能是POST,那么现在请写出类似
http://www.domain.com/script.php? 参数1=值1&参数2=值2..... 的结果
PHP代码如下,比如文件名是allparam.php- <?php
- $query_string = "";
- if ($_POST) { //如果是post方法,取得全部post参数及值后进行连接处理
- $kv = array();
- foreach ($_POST as $key => $value) {
- $kv[] = "$key=$value";
- }
- $query_string = join("&", $kv);
- }
- else { //非post方法,GET等。
- $query_string = $_SERVER['QUERY_STRING'];
- }
- $execfile=$_SERVER["REQUEST_URI"];
- if (strstr($execfile,"?")){ //如果请求URI中包含?则执行文件取?前面的部分
- $execfile = substr($execfile,0,strlen($execfile) - strlen(strstr($execfile,"?")));
- }
- echo "http://".$_SERVER["SERVER_NAME"].$execfile."?".$query_string;
- ?>
复制代码 测试代码,post测试(这个html文件和allparam.php文件在同一个目录里)- <html>
- <head>
- <title>Param Test </title>
- </head>
- <body>
- <form action="allparam.php" method="post">
- Name:<input type=text value="" name="name"><br>
- Addr:<input type=text value="" name="address"><br>
- <input type=submit value="提交">
- </form>
- </body>
- </html>
复制代码 get测试:- http://localhost/allparam.php?c=dd&e=xx
复制代码 21、写出一个能创建多级目录的PHP函数 http://bbs.chinaunix.net/redirec ... 788191&pid=12883652- <?php
- function createdir($path,$mode){
- if (is_dir($path)){ //判断目录存在否,存在不创建
- echo "目录'" . $path . "'已经存在";
- }else{ //不存在创建
- $re=mkdir($path,$mode,true); //第三个参数为true即可以创建多极目录
- if ($re){
- echo "目录创建成功";
- }else{
- echo "目录创建失败";
- }
- }
- }
- $path="/aa/bb/cc/cd"; //要创建的目录
- $mode=0755; //创建目录的模式
- createdir($path,$mode);//测试
- ?>
复制代码 22、有一个留言板,用mysql做数据库 http://bbs.chinaunix.net/redirec ... 91&pid=12953574
用户信息包括:用户名,密码,email
留言内容包括:留言ID,标题,内容,发表时间,状态(审核,未审核)
请实现下列需求:
1)数据库结构。无需写建表语句,用类似下面的表格,描述清楚即可
表明 table_aaa
字段名 字段说明 字段类型 索引
name 姓名 Varchar(64) 唯一索引
gender 性别 Enum(‘M’,‘F’)
注意,要在索引栏中注明是否需要创建索引,以及要创建的索引的类型
用一个sql语句查询出发表留言数量大于10条的用户名及其留言数量,查询结果按留言数量降序排列
解答:
用户信息表:
表名:tbl_user
username 用户名 varchar(20) 唯一索引
passwd1 密码 varchar(20)
email email varchar(100)
留言内容表:
表名:tbl_content
conid 留言ID int
title 标题 varchar(100)
content 内容 varchar(4000)
devtime 发表时间 datetime
state 状态(审核,未审核) varchar(1)
username 用户名 varchar(20) 可重复索引
select username,count(*)
from tbl_content
group by username
having count(*) > 10
order by count(*) desc
23、写出php的public、protected、private三种访问控制模式的区别
public是所有的类中都能访问,protected是只能在本类及继承该类的子类能访问。private只能在本类中访问。
24、 给你三个数,写程序求出其最大值。- <?php
- function getMax($a,$b,$c){
- $max = $a;
- if ($b > $max){
- $max = $b;
- }
- if ($c > $max){
- $max = $c;
- }
- return $max;
- }
- echo getMax(3,2,15);
- ?>
复制代码 25、写出查询发贴数最多的十个人名字的SQL,利用下表:http://bbs.chinaunix.net/redirec ... 788191&pid=12880115
members(id,username,posts,pass,email)
我理解posts是发帖量(整型)。所以我的SQL语句如下:- select username from members order by posts desc limit 10;
复制代码 26、如何通过javascript判断一个窗口是否已经被屏蔽。http://bbs.chinaunix.net/redirec ... 91&pid=12953882- <script type="text/javascript" language="javascript">
- /**
- * 参数说明:url - 要打开的窗口
- * mode - true 模态打开 false 非模态打开
- * 返回值:boolean true 没有屏蔽 false 被屏蔽
- */
- function checkshield(url,mode){
- var breturn = true;
- if (mode){ //模态打开
- if (window.open(url) == false) return false;
- }else{ //非模态打开
- try{
- window.showDialogMode(url);
- }catch (err){
- breturn = false;
- }
- }
- return breturn;
- }
- </script>
复制代码 27、有一数组 $a=array(4,3,8,9,2);请将其重新排序(按从小到大的顺序列出)。http://bbs.chinaunix.net/redirec ... 788191&pid=12880278
- <?php
- $a=array(4,3,8,9,2);
- for($i=0;$i<sizeof($a);$i++){
- for ($j = $i + 1;$j<sizeof($a);$j++){
- if ($a[$i] > $a[$j]){
- $itemp = $a[$i];
- $a[$i]=$a[$j];
- $a[$j] = $itemp;
- }
- }
- }
- print_r($a);
- ?>
复制代码 28、写出匹配邮箱地址和URL的两个正则表达式。类似下面的:http://bbs.chinaunix.net/redirec ... 788191&pid=12883954
邮箱地址:user_name.first@hztraining.com
URL地址:http://www.hztraining.com/user_profile.php?uid=100- <?php
- //匹配Email
- $pattern='/(\w+)\@(\w+)\.((\w+))+/';
- $email='wangchc_chc.xx@163.xx';
- if (preg_match($pattern,$email))
- echo "match";
- else
- echo "not match";
- echo "<Br>";
- //匹配Url
- $patternurl='/http(s?):\/\/(((\w+)\.)+)(\w+)\/(\w-\.\?\%\&\=)*/';
- $url="http://www.hztraining.com/user_profile.php?uid=100";
- if (preg_match($patternurl,$url))
- echo "match";
- else
- echo "not match";
- ?>
复制代码 29、对于大流量的网站,您采用什么样的方法来解决访问量问题? http://bbs.chinaunix.net/redirec ... 788191&pid=12893318
首先,确认服务器硬件是否足够支撑当前的流量。
其次,优化数据库访问。
第三,禁止外部的盗链。
第四,把持大文件的下载。
第五,应用不同主机分流重要流量
第六,应用流量分析统计软件。
30、MySQL数据库,一天一万条以上的增量,怎么优化?http://bbs.chinaunix.net/redirec ... 788191&pid=12893363
首先应该做好mysql基本优化,字段大小,索引;
另外根据具体的需求看有没有必要建立二个一样的表,一个是存储历史数据,一个是当天的或者最近多少天的;
根据日期建立索引这个应该有必要;
31、写个函数来解决多线程同时读写一个文件的问题。http://bbs.chinaunix.net/redirec ... 91&pid=12959126
- <?php
- /**
- * 参数说明:$filename string 操作文件名
- * $content string 写入文件内容,读时传入空就可以
- * $mode string r-读 w-写
- * 返回值 $retstr string 返回信息(读取时返回文件内容)
- */
- function multiAccessFile($filename,$content,$mode){
- $retstr = "";
- if (file_exists($filename) == false) {
- $retstr = "文件不存在";
- }
- if ($mode == "w"){
- $file=fopen($filename,"w+");
- if(flock($file,LOCK_EX))
- {
- fwrite($file,$content);
- flock($file,LOCK_UN);
- $retstr="文件写入成功";
- }
- else{
- $retstr = "文件写入时发生错误";
- }
- }
- if ($mode == "r"){
- $file = fopen($filename,"r");
- if (flock($file,LOCK_EX))
- {
- $retstr = fread($file,filesize($filename));
- flock($file,LOCK_UN);
- }else{
- $retstr = "读取文件时发生错误";
- }
- }
- fclose($file);
- return $retstr;
- }
- ?>
复制代码 32、一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列。要求执行效率高。并说明如何改善执行效率。(该函数必须自己实现,不能使用php函数)http://bbs.chinaunix.net/redirec ... 91&pid=12954958- <?php
- /**
- *功能:32、一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列。要求执行效率高。并说明如何改善执行效率。(该函数必须自己实现,不能使用php函数)
- *参数:待排序数组
- *返回:排序后数组
- */
- function sortArr($arr){
- if (sizeof($arr)<2) return $arr; //数组元素为1个或者0个,返回。
- /*
- *借鉴冒泡算法,但又和算法不一样。执行次数应该为(n-1)+(n-2)+.....+1次,其他的优化方法暂时没有思路
- */
- for ($i=0;$i<sizeof($arr);$i++){
- for ($j=$i+1;$j<sizeof($arr);$j++){
- if ($arr[$i]<$arr[$j]){ //用第一个和后面的比较,保证第一个最大;以此类推,第二个和以后的比较
- $temp = $arr[$i];
- $arr[$i] = $arr[$j];
- $arr[$j] = $temp;
- }
- }
- }
- return $arr;
- }
- //测试
- $test_arr=array(10,2,5,1,9,21,13);
- print_r(sortArr($test_arr));
- ?>
复制代码 33、写一个函数,算出两个文件的相对路径 http://bbs.chinaunix.net/redirec ... 788191&pid=12898932
如 $a = '/a/b/c/d/e.php';
$b = '/a/b/12/34/c.php';
计算出 $b 相对于 $a 的相对路径应该是 ../../c/d将()添上- <?php
- $a = '/c/d/d/e.php';
- $b = '/a/c/d/e.php';
- $aArr = explode('/',dirname($a));
- $bArr = explode('/',dirname($b));
- $aLen = count($aArr);
- $bLen = count($bArr);
- $maxLen = max($aLen,$bLen);
- for($i = 1; $i < $maxLen; $i++){
- if($aArr[$i] != $bArr[$i] && isset($aArr[$i])){
- if(isset($bArr[$i]))$bUrl[]=$bArr[$i];
- $relativePath .= "../";
- }else{
- $bUrl[]=$bArr[$i];
- }
- }
- echo $relativePath.implode('/',$bUrl).'/'.basename($b);
- ?>
复制代码 34、用写一个类实现会员管理,要求实现:
1)用文件存储会员信息,会员注册输入用户名和电子邮件就行。
2)用户信息包括:用户名,电子邮件。
3)要求用户可以登录、退出和注销用户。
4)如果用户没有退出,下次登录自动显示用户名。
5)保存用户上次浏览时间。
http://bbs.chinaunix.net/redirec ... 91&pid=12966715 |
|