京东2016笔实习生在线笔试题

1.三子棋题

大致题目的意思如下:

在3* 3方格中

同行或同列或对角线有三个相同的,则胜出

输出结果只能为

1.x胜出

2.o胜出

3.平局

4.下一步该x

5.下一步该o

6.给的棋局有问题


输入:

x 0  x

. x  .

0 . x

输出

x胜出

个人思路:初始化棋牌之后,由输入判断x、0各选手已经下棋的步数以及剩余可以下棋的步数,判断两个选手下棋步数差值是否合理,如果不合理则棋牌非法,然后判断是否由选手胜出,如果由选手胜出,则棋牌结束,否则判断下一步该哪个选手下棋。

php代码实现效果如下:

<?php
function fn($input){
	$box=array();
	$xUser=0;
	$oUser=0;
	$blank=0;

	for ($i=0,$j=0; $i <9; $i++) { 
		$tm=$i % 3;
		if(0== $tm && $i!=0){
			++$j;
		}
		$box[$j][$tm]=$input[$i];
		if($input[$i]=='x'){
			$xUser++;
		}else if($input[$i]=='0'){
			$oUser++;
		}else{
			$blank++;
		}
	}
	//判断是否有胜出	
	$isLegal=(abs($xUser-$oUser)>1);
	if($isLegal){
		echo '棋局不合法';
	}else{
		$result=checkResult($box);
		if($result == false){
			if($blank==0){
				echo '平局';
			}else if($xUser !=$oUser){
				$next=($xUser > $oUser)? '0':'x';
				echo '下一步该'.$next;
			}else{
				echo '棋局不合法';
			}
		}else{
			echo $result;
		}
	}	
}
function checkResult($box){
	//检查行
	for ($i=0; $i <3 ; $i++) { 
		if($box[$i][0] == $box[$i][1] && $box[$i][0]==$box[$i][2] && $box[$i][0] !='.'){
			return $box[$i][0].':胜出';
		}
	}
	//检查列
	for ($i=0; $i <3 ; $i++) { 
		if($box[0][$i] == $box[1][$i] && $box[0][$i]==$box[2][$i] && $box[0][$i] !='.'){
			return $box[0][$i]. ':胜出';
		}
	}
	//检查正对角线
	if($box[0][0] == $box[1][1] && $box[1][1]==$box[2][2] && $box[1][1] !='.'){
		return $box[1][1]. ':胜出';
	}
	//检查斜对角线
	if($box[0][2] == $box[1][1] && $box[1][1]==$box[2][0] && $box[1][1] !='.'){
		return $box[1][1]. ':胜出';
	}
	return false;
}

//输出棋牌
function showBox($input){
	echo '<table cellspacing =0 cellpadding=0 border=1><tr>';
	for ($i=0; $i <9 ; $i++) { 
		echo '<td width="30px" align="center">'.$input[$i].'</td>';
		if(($i+1) %3 ==0 && $i !=0){
			echo '</tr><tr>';
		}
	}
	echo '</tr></table>';
}

//测试1
$input=array('x','0','x','0','0','.','x','0','0');
showBox($input);
fn($input);
//测试2
$input=array('x','x','x','0','0','.','x','0','0');
showBox($input);
fn($input);


2.证劵委托题

题目的详细信息已经记不住,只能大致描述一下,就是求最有价值的的委托信息。

n、s、B、S

其中n代表委托信息,s要求的最有价值的委托信息的个数,B代表买入、S代表卖出

输出:

6 2

B 50 2 

S 50 1 

S 20 2 

S 30 1 

B 40 4 

B 50 6 

输出:

B 50 8

B 40 4

S 50 1

S 30 2

(备注:6代表委托信息的个数、2代表表示买入和卖出委托信息各返回2个 ,其中每行如“B 50 2",第一个字段B代表买入,S代表卖出,50代表价格,最后一个字段代表数量)

个人的思路:就是需要将类型(买入和卖出)相同的合并一下,然后依据价格的大小进行排序,最后取出最大的s个委托信息

你可能感兴趣的:(京东2016笔实习生在线笔试题)