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){
		$num+=@$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" );
    }
};



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值