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

2020-03-30  本文已影响0人  沙蒿同学

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


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

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

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


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

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


要求:

  1. 实现语言不限,但代码要简洁。
  2. 请确保代码无语法错误,并无运行时错误。
  3. 请说明代码的运行环境。
<?php

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, ),英镑(GBP, £),欧元(EUR, €),港币(HKD, HK),日元(JPY, ¥)

接口示例(PHP代码)如下:
interface RateConverter
{
    /**
     * 输入由币种价格组成的字符串,输出人民币的实时价格
     * @param string $price
     * @return float
     */
    public function convertToCNY(string $price): float;
}

要求:

  1. 实现语言不限,但代码要简洁。
  2. 请确保代码无语法错误,并无运行时错误。
  3. 请说明代码的运行环境。
  4. 请施展你所掌握的设计模式和软件工程规范。
<?php

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);
    }
}
上一篇 下一篇

猜你喜欢

热点阅读