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

原创 2015年11月16日 18:13:18

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" );
    }
};



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

相关文章推荐

php获取服务器端mac和客户端mac的地址

获取服务器mac

fread与file_get_contents读取文件的区别

关于这两个函数的官方解释是这样的:           fread()                      函数读取文件(可安全用于二进制文件)。            语法      ...

每个程序员1小时内必须解决的5个编程问题--解答代码

每个程序员1小时内必须解决的5个编程问题,我的解答代码

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

2015.05.10在SCDN中看到了一篇《每个程序员1小时内必须解决的5个编程问题》的博文 问题如下: 问题1:使用for循环、while循环和递归写出3个函数来计算给定数列的总和。 问题2:...

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

转载自:http://begeek.cn/post/6374.html 每次我发布软件工程师的岗位工作要求,各种求职申请就会纷至沓来,接踵而至。但每每让我困惑的是,似乎总有那么几位应...

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

每次我发布软件工程师的岗位工作要求,各种求职申请就会纷至沓来,接踵而至。但每每让我困惑的是,似乎总有那么几位应聘者完全不明白所谓“编程”的意思。 当然,他们另有想法。 而我认为,如果你应聘的是...

每个程序员1小时内必须解决的5个编程问题之难题

昨天看到一篇文章说,软件开发人员应一小时完成的5道题,其中第5道题,还是比较难的。看了一下作者的原来解题思路,就是采用治减法,这是一类问题的算法题,如果没有接触过,确实有点难度。作者提供了JAVA的源...

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

前几天码农网上以为资深工程师提出来的问题,一时间网上答案各种,这里我简单整理了一下,代码来源为JAVA吧,当然随着时间的推移各种版本答案还在不断涌现,大家仅供参考 package com.zsq.f...

5个编程问题(1小时解决)

题目来自于博客园:http://news.cnblogs.com/n/520705/?utm_source=tuicool    一个小时解决有点难度。 程序位于:D:\C#编程代码\demo基础...

一小时内解决这五道编程题才配叫程序员

每次我发布软件工程师的岗位工作要求,各种求职申请就会纷至沓来,接踵而至。但每每让我困惑的是,似乎总有那么几位应聘者完全不明白所谓“编程”的意思。 当然,他们另有想法。 而我认为,如果你...
  • p168455
  • p168455
  • 2016年02月27日 20:35
  • 332
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:php版 - 每个程序员1小时内必须解决的5个编程问题
举报原因:
原因补充:

(最多只允许输入30个字)