您现在的位置是:首页 > PHP > 解析一道面试题 网站首页 PHP

解析一道面试题

Tom2018-08-24 945人围观
PHP  
简介 暂无

在朋友的博客上看到这样一个面试题

比如说我输入一个9,然后就打印出以下的图形:

22.png

当初想了一下这个,还可以玩啊,也不看他做的思路,决定自己动手尝试,看到这个我出现的第一个想法就是记录各个数字的实际位置和数字,在用作排序,结果坑多坑少谁用谁知道

问题:

  1. 数字为顺时针旋转排序,当然程序的输出,肯定不会遵循这种走法,程序上最多就一行输出完成就换行,再起一行,根本到不到要求,所以还需要做点什么

  2. 或者可以先求出每行的数字,再直接一行一行输出就可以了,目前就是使用的这种方法

思考与做法:

  1. 最开始尝试的时候,想到了拐点,数字是到了固定拐点就开始切换排列方向,比如向右->向下->向左->向上,又开始下一轮回,这个的这个点首先找对,开始找错了,坑掉了一大堆代码

  2. 坐标系定位法,花了一张坐标图来确定每个拐点的位置,计算每个拐点的规律,基本用上了初中时候的坐标视图,看来初中是没有白学的,用的第四象限,不过xy点坐标我为了好记,取得反的,不影响使用

  3. 然后根据坐标点来套结果,OOK了

  4. xy.jpgfang_看图王.png


上代码吧

//顺时针打印正方体类
class Tclock{
	public $num;//开始数字
	public $bian;//边长
	public $count_num;//数字的个数
	public $jiou;//0代表偶数,其他代表奇数
	function __construct($num,$bian){
		if($bian<2){
die('边长至少为2个'); } $this->num = $num; $this->bian = $bian; $this->count_num = $bian*$bian; $this->jiou = $bian%2; $this->max_num = $bian*$bian+$num-1; } /** * show 显示 * */ public function show(){ $zhou_arr  = $this->wai_num($this->num,$this->bian); $show_arrs = $this->make_xy($this->bian,$zhou_arr); $over_arrs = $this->make_arr($show_arrs,$this->jiou); $this->let_go($over_arrs); } /* *排序坐标,并输出 *每个x坐标的数据为一行 */ public function let_go($over_arrs){ $over_new_arr=array(); foreach($over_arrs as $pk=>$pv){ $pk_arr = explode(',',$pk); $over_new_arr[$pk_arr['0']][$pk_arr['1']] = $pv; } $color = ['red','black','blue']; $html='<table>'; foreach($over_new_arr as $ak =>$av){ ksort($av); $html.='<tr>'; foreach($av as $aak=>$aav){ $html.='<td style="color:'.$color[ $aav['tong'] ? $aav['tong']%3 : 0].'">'.$aav['num'].'</td>'; } $html.='</tr>'; } $html.='<table>'; echo $html; } /* *计算这几圈的数字的个数 和数字 * */ public function wai_num($num,$bian){ $zhou = floor($bian/2); $start_num = $num; for($j=0;$j<$zhou;$j++){ $zhou_arr[$j]['all_num']=(($bian-($j*2))*4)-4; //哪些数字 for($k=0;$k<$zhou_arr[$j]['all_num'];$k++){ $zhou_arr[$j]['num'][] = $start_num; $start_num++; } } return $zhou_arr; } /* *新坐标计算 */ public function make_xy($bian,$zhou_arr){ $tmp_bian = $bian; $jj = 1; foreach($zhou_arr as $key => $val){ $new_bian = ($bian-($key*2));//当前边长 $next_bian = ($bian-(($key+1)*2));//下圈边长 //找出转折点 $zhuan1 = $val['num'][0]; $zhuan2 = $zhuan1+$next_bian+1; $zhuan3 = $zhuan2+$next_bian+1; $zhuan4 = $zhuan3+$next_bian+1; $x1 = $jj;  $x2 = $tmp_bian; //1-2 $show_arrs[$key]['one_two']['start_xu'] = $x1.','.$x1; $show_arrs[$key]['one_two']['end_xu'] = $x1.','.$x2; $show_arrs[$key]['one_two']['start_num'] = $zhuan1; $show_arrs[$key]['one_two']['end_num'] = $zhuan2; //2-3 $show_arrs[$key]['two_three']['start_xu'] = $x1.','.$x2; $show_arrs[$key]['two_three']['end_xu'] = $x2.','.$x2; $show_arrs[$key]['two_three']['start_num'] = $zhuan2; $show_arrs[$key]['two_three']['end_num'] = $zhuan3; //3-4 $show_arrs[$key]['three_four']['start_xu'] = $x2.','.$x2; $show_arrs[$key]['three_four']['end_xu'] = $x2.','.$x1; $show_arrs[$key]['three_four']['start_num'] = $zhuan3; $show_arrs[$key]['three_four']['end_num'] = $zhuan4; //4-1 $show_arrs[$key]['four_one']['start_xu'] = $x2.','.$x1; $show_arrs[$key]['four_one']['end_xu'] = $x1.','.$x1; $show_arrs[$key]['four_one']['start_num'] = $zhuan4; $show_arrs[$key]['four_one']['end_num'] = $zhuan1; //参数-- $tmp_bian--; $jj++; } return $show_arrs; } /* *坐标处理生成合并 */ public function make_arr($show_arrs,$jiou){ //处理生成合并 foreach($show_arrs as $sk=>$sv){ //依次处理 foreach($sv as $ssk =>$ssv){ //1-2 if($ssk=='one_two'){ $s = $ssv['start_xu']; for($ssv_num=$ssv['start_num'];$ssv_num<=$ssv['end_num'];$ssv_num++){ $over_arrs[''.$s]['xu'] = $s; $over_arrs[''.$s]['num'] = $ssv_num; $over_arrs[''.$s]['tong'] = $sk; //拆出来加 $s_arr=explode(',',$s); !isset($s_arr[1]) ? $s_arr[1] = 1 :$s_arr[1]++; $s=implode(',',$s_arr); } } //2-3 if($ssk=='two_three'){ $s = $ssv['start_xu']; for($ssv_num=$ssv['start_num']+1 ;$ssv_num<$ssv['end_num']+1;$ssv_num++){ $s_arr=explode(',',$s); !isset($s_arr[0]) ? $s_arr[0] = 1 :$s_arr[0]++; $s=implode(',',$s_arr); $over_arrs[''.$s]['xu'] = $s; $over_arrs[''.$s]['num'] = $ssv_num; $over_arrs[''.$s]['tong'] = $sk; } } //3-4 if($ssk=='three_four'){ $s = $ssv['start_xu']; for($ssv_num=$ssv['start_num']+1;$ssv_num<$ssv['end_num']+1;$ssv_num++){ $s_arr=explode(',',$s); !isset($s_arr[1]) ? $s_arr[1] = 0 :$s_arr[1]--; $s=implode(',',$s_arr); $over_arrs[''.$s]['xu'] = $s; $over_arrs[''.$s]['num'] = $ssv_num; $over_arrs[''.$s]['tong'] = $sk; } } //4-1 if($ssk=='four_one'){ $s = $ssv['start_xu']; $xia_over_num = isset($show_arrs[$sk+1]['one_two']['start_num']) ? $show_arrs[$sk+1]['one_two']['start_num'] : 0; if($xia_over_num>0){ for($ssv_num=$ssv['start_num']+1;$ssv_num<$xia_over_num;$ssv_num++){ $s_arr=explode(',',$s); !isset($s_arr[0]) ? $s_arr[0] = 1 :$s_arr[0]--; $s=implode(',',$s_arr); $over_arrs[''.$s]['xu'] = $s; $over_arrs[''.$s]['num'] = $ssv_num; $over_arrs[''.$s]['tong'] = $sk; } }else{ if($jiou){ $s_arr=explode(',',$s); !isset($s_arr[0]) ? $s_arr[0] = 0 :$s_arr[0]--; $s_1=implode(',',$s_arr); $s_arr=explode(',',$s); !isset($s_arr[0]) ? $s_arr[0] = 0 :$s_arr[0]--; !isset($s_arr[1]) ? $s_arr[1] = 1 :$s_arr[1]++; $s_2=implode(',',$s_arr); $over_arrs[''.$s_1]['xu'] = $s_1; $over_arrs[''.$s_1]['num'] = $ssv['start_num']+1; $over_arrs[''.$s_1]['tong'] = $sk+1; $over_arrs[''.$s_2]['xu'] = $s_2; $over_arrs[''.$s_2]['num'] = $ssv['start_num']+1+1; $over_arrs[''.$s_2]['tong'] = $sk+1; } } } } } return $over_arrs; } } $tclock = new Tclock(8,20); $tclock ->show();


打赏本站,你说多少就多少

文章评论

image
2018-09-27 haha
haha

image
2018-08-31 阿里
666 写出来了

image
2018-08-28 你大爷
你写这个你是觉得你头发太多了? 需要多掉点?

image
2018-08-28 博主
需要练练思维社,总不能生锈社
image
2018-08-26 小华
可以!