2017自如技术大赛研发组题目三:给定数字连接最大数

3. 给定一个数组,将数组中的数字连接起来,求最大数。
示例:
输入:4,94,9,14,1
输出:9944141
 
【PHP实现】
<?php
/**
* Class Max
* 计算最大数字
* User: 郑凯
* Date: 2017/12/2
* Time: 14:02
*/

class Max {

//要进行处理的原始数字数组
public $numbers = array();
//经过处理后排序好的数字数组
public $lastNumber = array();


/**
* 获取整数某个位置的数字值
* @param $number
* @param int $position
* @return bool
*/
public function getPositionNumber($number,$position = 0)
{
//将数字当成字符串,将数字分离个位数存到数组中
for($i=0;$i<strlen($number);$i++){
$array[] = substr($number,$i,1);
}
return isset($array[$position])?$array[$position]:false;
}


/**
* 比较两个数,决定谁优先排在前面(即下面注释中的“最大数”)
* @param $a
* @param $b
* @return null
*/
private function compare($a,$b){

//默认最大值是null
$max = null;

//按两个数中数学概念中的最小数的长度进行从高到低每一位数字的对比
for($i = 0; $i<min(array(strlen($a),strlen($b))); $i++){

//如果同一位上的两个数字相等,则继续向下一位比较
if($this->getPositionNumber($a, $i) == $this->getPositionNumber($b, $i)){
continue;
}else{

//如果两个数字不等,则“最大数”是比较大的那个整数,跳出循环,不再继续比较
$this->getPositionNumber($a, $i) > $this->getPositionNumber($b, $i) ? $max = $a:$max = $b;
break;
}
}

//如果走到这里,说明数学概念中最小数的长度的头几位两个整数一样,那么就需要比较较长数字的下一位和较短数字的第一位
//首先判断这两个整数中哪个是短的
//如果两个整数长度一致,说明两个整数一样,则返回谁都可以
//如果较长数字的下一位比较短整数的第一位大,则“最大数”应该是前者,否则,应该是后者
if($max == null){
if(strlen($a)<strlen($b)){
$this->getPositionNumber($b, $i) > $this->getPositionNumber($a,0) ? $max = $b:$max = $a;
}elseif(strlen($a)>strlen($b)){

$this->getPositionNumber($a, $i) > $this->getPositionNumber($b,0) ? $max = $a:$max = $b;
}else{
$max = $a;
}
}

//返回“最大数”
return $max;
}


//主体函数,获取最大数字
public function getMaxNumber()
{

//初始化最大数,赋值为给定数字数组中的第一个
$max = array("key"=> 0, "value"=>$this->numbers[0]);

//对数组中的每个数字进行循环,将其与Max中的数字进行比较
for($j=0 ;$j < count($this->numbers); $j++){

$tempMax = $this->compare($this->numbers[$j],$max['value']);

//如果得到的“最大数”应不是原来的“最大数”,那么进行最大数的更新(更新key和value),这里的key主要用于下面的unset
if($tempMax != $max['value']){
$max['value'] = $tempMax;
$max['key'] = $j;
}
}

//把这一轮比较中的“最大数”放入数组中
$this->lastNumber[] = $max;
//将这个比较出来的“最大数”从原始数组中删除,不再让他捣乱啦
unset($this->numbers[$max['key']]);
//将原始数组重建key
$this->numbers = array_values($this->numbers);
//如果原始数组中还有数组,继续递归调用
if(count($this->numbers) > 0){
$this->getMaxNumber();
}


}

//输出最后连起来最大的数字
public function getResult()
{

$this->getMaxNumber();
foreach($this->lastNumber as $key => $value){
echo $value['value'];
}
}
}

//获取输入变量
$numbers = explode(',', trim(fgets(STDIN), " \t\n\r\0\x0B[]"));

//实例化
$max = new Max();
$max->numbers = $numbers;
$max->getResult();

0 个评论

要回复文章请先登录注册