1. 云栖社区>
  2. PHP教程>
  3. 正文

php版 - 每个程序员1小时内必须解决的5个编程问题

作者:用户 来源:互联网 时间:2017-12-01 14:07:50

编程问题程序员小时

php版 - 每个程序员1小时内必须解决的5个编程问题 - 摘要: 本文讲的是php版 - 每个程序员1小时内必须解决的5个编程问题, php版 - 每个程序员1小时内必须解决的5个编程问题,有需要的朋友可以参考下。 6月份看到的五道题,自己做了下,感觉有点意思,前四个很简单,最后一个有点难,用了笨办法做出来了 //1、使用for循环、while循环和递归写出3个函数来

php版 - 每个程序员1小时内必须解决的5个编程问题,有需要的朋友可以参考下。


6月份看到的五道题,自己做了下,感觉有点意思,前四个很简单,最后一个有点难,用了笨办法做出来了

//1、使用for循环、while循环和递归写出3个函数来计算给定数列的总和。echo '1 - <br>';$str='1,5,6,8,9,4,2';echo "<pre>";print_r(fun1($str));echo "</pre>";function fun1($str){	$arr=explode(',',$str);	$count=count($arr);	$numfor=$numwhile=$numdeep=0;	for($i=0;$i<$count;$i++){		$numfor+=$arr[$i];	}	$return['numfor']=$numfor;	$w=0;	while($w<$count){		$numwhile+=$arr[$w];		$w++;	}	$return['numwhile']=$numwhile;	$return['numdeep']=numdeep($arr,$count);	return $return;}function numdeep($arr,$count){	static $num;	if($count>=0){		[email protected]$arr[$count];		numdeep($arr,--$count);	}	return $num;}//2、编写一个交错合并列表元素的函数。例如:给定的两个列表为[a,B,C]和[1,2,3],函数返回[a,1,B,2,C,3]。echo '2 - <br>';$arr1=array('a','B','C');$arr2=array(1,2,3);echo "<pre>";print_r(fun2($arr1,$arr2));echo "</pre>";function fun2($arr1,$arr2){	$new=array();	$count=count($arr1);	for($i=0;$i<$count;$i++){		$new[]=$arr1[$i];		$new[]=$arr2[$i];	}	return $new;}//3、编写一个计算前100位斐波那契数的函数。根据定义,斐波那契序列的前两位数字是0和1,随后的每个数字是前两个数字的和。例如,前10位斐波那契数为:0,1,1,2,3,5,8,13,21,34。echo '3 - <br>';fun3();function fun3(){	$num=100;	$arr=array(0,1);	for($i=0;$i<$num;$i++){		$count=count($arr);		if($arr[$count-1]>=$num){			unset($arr[$count-1]);			break;		}elseif($count==2){			$arr[]=1;		}else{			$arr[]=$arr[$count-1]+$arr[$count-2];		}	}	echo join(',',$arr).' <br>';}//4、编写一个能将给定非负整数列表中的数字排列成最大数字的函数。例如,给定[50,2,1,9],最大数字为95021。echo '4 - <br>';fun4();function fun4(){	$arr=array(50,2,1,9);	$count=count($arr);	$new=array();	foreach($arr as $k=>$v){		$new[]=substr($v,0,1);	}	arsort($new);	$str='';	foreach($new as $k=>$v){		$str.=$arr[$k];	}	echo $str;}//5、编写一个在1,2,…,9(顺序不能变)数字之间插入+或-或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。//例如:1 + 2 + 34 – 5 + 67 – 8 + 9 = 100。fun5();function fun5(){	$arr=array(1,2,3,4,5,6,7,8,9);//8	$t=array('+','-','');//3^8	$may=array();	$countt=count($t);	for($a=0;$a<$countt;$a++){		for($b=0;$b<$countt;$b++){			for($c=0;$c<$countt;$c++){				for($d=0;$d<$countt;$d++){					for($e=0;$e<$countt;$e++){						for($f=0;$f<$countt;$f++){							for($g=0;$g<$countt;$g++){								for($h=0;$h<$countt;$h++){									$str = "1$t[$a]2$t[$b]3$t[$c]4$t[$d]5$t[$e]6$t[$f]7$t[$g]8$t[$h]9";								//	$may[]=$str;									$tmpnum = '';									eval("/$tmpnum=1$t[$a]2$t[$b]3$t[$c]4$t[$d]5$t[$e]6$t[$f]7$t[$g]8$t[$h]9;");									if($tmpnum==100){										$may[]=$str.' = 100';									}								}							}						}					}				}			}		}	}	echo "<pre>";	print_r($may);	echo "</pre>";}
第五题,之前就想过要用递归实现,一直没想到,今天看到有人用js 实现了,照着 copy 份 php的实现方法

$str='1,2,3,4,5,6,7,8,9';$data = [];fun5($str,'');function fun5($str,$pre){	global $data;	$a = explode(',',$str);	$t = str_replace(',','',$str);	if(strlen($t)==2){		$data[] = $pre.(join('+',$a));		$data[] = $pre.(join('-',$a));		$data[] = $pre.$t;	}else{		$c = $a[0];		unset($a[0]);		$s = join(',',$a);		fun5($s, $pre.$c.'+');		fun5($s, $pre.$c.'-');		fun5($s, $pre.$c);	}}foreach($data as $k=>$v){	eval("/$num = $v;");	if($num==100){		echo $v.' = 100<br>';	}}

附上js 的解题方法

var str = "123456789";var ways = [];function exec(str, pre) {    var a = str.split("");    if( str.length === 2 ){ways.push( pre + a.join("+") );ways.push( pre + a.join("-") );ways.push( pre + str );    }else{var c = str.charAt(0),s = str.substring(1);exec( s, pre + c + "+" );exec( s, pre + c + "-" );exec( s, pre + c );    }}exec( str, "" );for (var i = 0; i < ways.length; i++) {    if( eval( ways[i] ) === 100 ){console.log( ways[i] + " = 100" );    }};



版权声明:本文为博主原创文章,未经博主允许不得转载。

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索编程 , 问题 , 程序员 小时 ,以便于您获取更多的相关知识。