php后端工程师面试题,西洋汇后端工程师面试题目

本人于上周五(2020.3.27)离职,近期居家反思学习,思考往后的路该怎么走?是按部就班找个差不多薪资的工作呆在,还是做好个人职业规划,确定方向,规划未来,又或走一步看一步,随波逐流....不管怎样,面对未知、迷茫和困难,应未雨绸缪,学习着充实自己,故分享两道西洋汇官网上的在线题目。当然不是最优解,只是本人的答题过程。(如侵权可联系作者删除)

1、【必答】数据结构与算法

有 JSON 数据如链接所示:点击查看JSON数据

请实现方法:输入类目的 id,输出类目的层级结构。

示例一:输入 1120,输出 女士 > 服装 > 针织衫

示例二:输入 2221,输出 男士 > 鞋履 > 运动鞋 > 篮球鞋

要求:

实现语言不限,但代码要简洁。

请确保代码无语法错误,并无运行时错误。

请说明代码的运行环境。

namespace App\Controller;

/**

* 运行环境

* PHP 7.3.8 (cli) (built: Aug 19 2019 11:36:13) ( NTS )

* Copyright (c) 1997-2018 The PHP Group

* Zend Engine v3.3.8, Copyright (c) 1998-2018 Zend Technologies

* Class Category

* @package App\Controller

*/

class Category

{

//获取类目数据源

protected $url = 'https://job.xiyanghui.com/api/q1/json';

/**

* 查找指定类目id类目归属顺序

* @param $id

* @return string

*/

public function getCategoryOrder($id)

{

$result = '';

$categories = $this->getUrlContent($this->url);

$this->findCategory($categories, $id, $result);

return $result;

}

/**

* 查看目标类目

* @param $categories

* @param $id

* @param $result

* @return bool

*/

public function findCategory($categories, $id, &$result)

{

foreach ($categories as $category) {

if (isset($category['children'])) {

if ($this->findCategory($category['children'], $id, $result)) {

$result = $category['name'] . ' > ' . $result;

return true;

}

} else {

if ($category['id'] == $id) {

$result = $category['name'];

return true;

}

}

}

}

/**

* url请求获取内容

* @param $url

* @return mixed

*/

public function getUrlContent($url)

{

$ch = curl_init();

$timeout = 5;

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

$contents = curl_exec($ch);

curl_close($ch);

return json_decode($contents, true);

}

}

2、【必答】软件工程规范

有汇率接口如链接所示:点击查看汇率接口

请根据汇率接口实现 SDK 类,可提供方法,输入币种与价格,输出人民币相应的实时价格。

示例一:输入 $1,999.00,输出 14044.37

示例二:输入 HKD2399,输出 2150.94

示例二:输入 EUR499.99,输出 3890.77

示例二:输入 €499.99,输出 3890.77

只考虑币种:美元(USD,

math?formula=)%EF%BC%8C%E8%8B%B1%E9%95%91(GBP%2C%20%C2%A3)%EF%BC%8C%E6%AC%A7%E5%85%83(EUR%2C%20%E2%82%AC)%EF%BC%8C%E6%B8%AF%E5%B8%81(HKD%2C%20HK),日元(JPY, ¥)

接口示例(PHP代码)如下:

interface RateConverter

{

/**

* 输入由币种价格组成的字符串,输出人民币的实时价格

* @param string $price

* @return float

*/

public function convertToCNY(string $price): float;

}

要求:

实现语言不限,但代码要简洁。

请确保代码无语法错误,并无运行时错误。

请说明代码的运行环境。

请施展你所掌握的设计模式和软件工程规范。

namespace App\Controller;

/**

* * 运行环境

* PHP 7.3.8 (cli) (built: Aug 19 2019 11:36:13) ( NTS )

* Copyright (c) 1997-2018 The PHP Group

* Zend Engine v3.3.8, Copyright (c) 1998-2018 Zend Technologies

* Interface RateConverter

* @package App\Controller

*/

interface RateConverter

{

/**

* 输入由币种价格组成的字符串,输出人民币的实时价格

* @param string $price

* @return float

*/

public function convertToCNY(string $price): float;

}

class RateConverterToCNY implements RateConverter

{

protected $reg = '/^[a-zA-Z$£€¥]$/'; // 正则句

protected $CNY = 'CNY'; // 人民币

protected $url = 'https://app-cdn.2q10.com/api/v2/currency'; //请求url内容

/**

* 输入由币种价格组成的字符串,输出人民币的实时价格

* @param string $price

* @return float

*/

public function convertToCNY(string $price): float

{

//单元,金额

list($unit, $num) = $this->divisionPrice($price);

//获取汇率转换表

$rateContent = $this->getUrlContent($this->url);

$toCNYRate = $rateContent['rates'][$this->CNY];

$toUSDRate = $rateContent['rates'][$unit];

//当前货币金额 / USD汇率 * CNY汇率

$toCNYPrice = ($num / $toUSDRate) * $toCNYRate;

return round((float)$toCNYPrice, 2);

}

/**

* 查分金额的单元和数额

* @param $price

* @return array

*/

public function divisionPrice(string $price): array

{

$reg = $this->reg;

$proArr = str_split($price); // 将字符串切割成数组

$proLen = count($proArr); // 计算该数组的长度

$wordStr = $numStr = ''; // 申请两个变量用于分别存放'字母'和'数字'

// 通过循环去核对数组中每个数据是否满足正则句

for ($iCount = 0; $iCount < $proLen; $iCount++) {

if (preg_match($reg, $proArr[$iCount], $match)) {

$wordStr .= $proArr[$iCount];

} else {

$numStr .= $proArr[$iCount];

}

}

switch ($wordStr) {

case '$':

$wordStr = 'USD';

break;

case '£':

$wordStr = 'GBP';

break;

case '€':

$wordStr = 'EUR';

break;

case 'HK$':

$wordStr = 'HKD';

break;

case '¥':

$wordStr = 'JPY';

break;

default:

break;

}

return array($wordStr, (float)$numStr);

}

/**

* url请求获取内容

* @param $url

* @return mixed

*/

public function getUrlContent($url)

{

$ch = curl_init();

$timeout = 5;

curl_setopt($ch, CURLOPT_URL, $url);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

$contents = curl_exec($ch);

curl_close($ch);

return json_decode($contents, true);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值