【PHP】单词十以内的加法de多种解法

问题描述

把两个英文单词加在一起~

写一个类Arith,实现下面的功能

  var k = new Arith("three");
  k.add("seven"); //返回 "ten"

输入 - zero 到 ten ,肯定是小写
输出 - 返回相加的结果,肯定是小写

分析

  • class
  • __construct
  • array
  • switch case

解决方案

数组取值array_flip反转键值


class Arith { 
    private $number;

    public $numbers = [
      'zero' => 0, 'one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, 'five' => 5,
      'six' => 6, 'seven' => 7, 'eight' => 8, 'nine' => 9, 'ten' => 10, 'eleven' => 11,
      'twelve' => 12, 'thirteen' => 13, 'fourteen' => 14, 'fifteen' => 15, 'sixteen' => 16,
      'seventeen' => 17, 'eighteen' => 18, 'nineteen' => 19, 'twenty' => 20
    ];

    public function __construct(string $number) {
      $this->number = $number;
    }

    public function add(string $number): string {
      $sum = $this->get($this->number) + $this->get($number);
      $flipped = array_flip($this->numbers);

      return $flipped[$sum];
    }

    public function get(string $number): int {
      // can convert to lower
      return (empty($this->numbers[$number])) ? 0 : $this->numbers[$number];
    }
}

const定义关系array_search查找对应关系

class Arith{ 
    private $i;
    const A = [
      'zero' => 0,
      'one' => 1,
      'two' => 2,
      'three' => 3,
      'four' => 4,
      'five' => 5,
      'six' => 6,
      'seven' => 7,
      'eight' => 8,
      'nine' => 9,
      'ten' => 10,
      'eleven' => 11,
      'twelve' => 12,
      'thirteen' => 13,
      'fourteen' => 14,
      'fifteen' => 15,
      'sixteen' => 16,
      'seventeen' => 17,
      'eighteen' => 18,
      'nineteen' => 19,
      'twenty' => 20
    ];

    public function __construct(string $i)
    {
      $this->i = self::A[$i];
    }

    public function add(string $v) {
        return array_search($this->i + self::A[$v], self::A);
    }
}

数组的索引查找关系


class Arith{ 
    private $_numbers = ["zero" => 0, "one" => 1, "two" => 2, "three" => 3, 
      "four" => 4, "five" => 5, "six" => 6, "seven" => 7, "eight" => 8,
      "nine" => 9, "ten" => 10, "eleven" => 11];

    private $_words = ["zero", "one", "two", "three", 
      "four", "five", "six", "seven", "eight",
      "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen",
      "sixteen", "seventeen", "eighteen", "nineteen", "twenty"];  

    private $_word = '';

    public function __construct($word) {
      $this->_word = $word;
    }

    public function add($word) {
      return $this->_words[$this->_numbers[$this->_word] + $this->_numbers[$word]];
    }
}

switch case确立关系

class Arith
{

    protected $num;

    //初始化数据

    public function __construct($num)
    {
        $this->num = $this->_tonNum($num);

    }

    private function _tonNum($num)
    {
        $num_num = 0;
        switch ($num) {
            case "zero":
                $num_num = 0;
                break;
            case "one":
                $num_num = 1;
                break;
            case "two":
                $num_num = 2;
                break;
            case "three":
                $num_num = 3;
                break;
            case "four":
                $num_num = 4;
                break;
            case "five":
                $num_num = 5;
                break;
            case "six":
                $num_num = 6;
                break;
            case "seven":
                $num_num = 7;
                break;
            case "eight":
                $num_num = 8;
                break;
            case "nine":
                $num_num = 9;
                break;
            case "ten":
                $num_num = 10;
                break;
            case "eleven":
                $num_num = 11;
                break;
            case "twelve":
                $num_num = 12;
                break;
            case "thirteen":
                $num_num = 13;
                break;
            case "fourteen":
                $num_num = 14;
                break;
            case "fifteen":
                $num_num = 15;
                break;
            case "sixteen":
                $num_num = 16;
                break;
            case "seventeen":
                $num_num = 17;
                break;
            case "eighteen":
                $num_num = 18;
                break;
            case "nineteen":
                $num_num = 19;
                break;
            case "twenty":
                $num_num = 20;
                break;
        }
        return $num_num;
    }


    /**
     * 转换成文字
     * @param $num
     */
    public function tostr($num)
    {
        $num_num = "";
        switch ($num) {
            case 0:
                $num_num = "zero";
                break;
            case 1:
                $num_num = "one";
                break;
            case 2:
                $num_num = "two";
                break;
            case 3:
                $num_num = "three";
                break;
            case 4:
                $num_num = "four";
                break;
            case 5:
                $num_num = "five";
                break;
            case 6:
                $num_num = "six";
                break;
            case 7:
                $num_num = "seven";
                break;
            case 8:
                $num_num = "eight";
                break;
            case 9:
                $num_num = "nine";
                break;
            case 10:
                $num_num = "ten";
                break;
            case 11:
                $num_num = "eleven";
                break;
            case 12:
                $num_num = "twelve";
                break;
            case 13:
                $num_num = "thirteen";
                break;
            case 14:
                $num_num = "fourteen";
                break;
            case 15:
                $num_num = "fifteen";
                break;
            case 16:
                $num_num = "sixteen";
                break;
            case 17:
                $num_num = "seventeen";
                break;
            case 18:
                $num_num = "eighteen";
                break;
            case 19:
                $num_num = "nineteen";
                break;
            case 20:
                $num_num = "twenty";
                break;
        }
        return $num_num;
    }

    //增加的方法
    public function add($add_num)
    {
        //做加法
        $add_num = $this->_tonNum($add_num);
        $re = $this->tostr($add_num + $this->num);
        //转换
        return $re;
    }

}

总结

解决问题的整体思路是差不多的,但是在具体实现细节上会有区别,而具体实现的点也就是考察的价值。

你可能感兴趣的:(php)