【问题标题】:Building a Japanese Numeral Reading System on PHP在 PHP 上构建一个日语数字阅读系统
【发布时间】:2014-04-11 03:57:18
【问题描述】:

我遇到了一个我觉得很好的面试问题。无法获得完整的答案,但是,感觉分享并要求正确的方法在 PHP 中进行编码。

问题是这样的:

Given the Japanese numeral reading system, write a program that converts an integer into the equivalent Japanese reading.

Basic numeral readings:
1: ichi
2: ni
3: san
4: yon
5: go
6: roku
7: nana
8: hachi
9: kyuu
10: juu
20: ni-juu
30: san-juu
100: hyaku
1000 : sen
10,000: man
100,000,000: oku
1,000,000,000,000: chou
10,000,000,000,000,000: kei

Exceptions due to voice rounding in Japanese reading:
300: sanbyaku
600: roppyaku
800: happyaku
3000: sanzen
8000: hassen
1,000,000,000,000: itchou
8,000,000,000,000: hatchou
10,000,000,000,000: jutchou (also applies to multiplies of 10,000,000,000,000)
10,000,000,000,000,000: ikkei
60,000,000,000,000,000: rokkei
80,000,000,000,000,000: hakkei
100,000,000,000,000,000: jukkei (also applies to multiplies of 10,000,000,000,000,000)
1,000,000,000,000,000,000: hyakkei (also applies to multiplies of 1,000,000,000,000,000,000)

Starting at 10,000, numbers begin with ichi if no digit would otherwise precede, e.g. 1,000 is sen but 10,000 is ichi-man.

Examples:
11: juu ichi
17: juu nana
151: hyaku go-juu ichi
302: san-byaku ni
469: yon-hyaku roku-juu kyuu
2025 : ni-sen ni-juu go
10,403: ichi-man yon-byaku san
41,892: yon-juu ichi-man happyaku kyuu-juu ni
80,000,000,000,000: hachi-jutchou

我试过的代码是:

$inputNumber = 2025;
$inputString = (String)$inputNumber;

$numeralReadings = array(
    1 => 'ichi',
    2 => 'ni',
    3 => 'san',
    4 => 'yon',
    5 => 'go',
    6 => 'roku',
    7 => 'nana',
    8 => 'hachi',
    9 => 'kyuu',
    10 => 'juu',
    20 => 'ni-juu',
    30 => 'san-juu',
    100 => 'hyaku',
    1000 => 'sen',
    10000 => 'man',
    100000000 => 'oku',
    1000000000000 => 'chou',
    10000000000000000 => 'kei'
);

$numeralExceptions = array(
    300 => 'sanbyaku',
    600 => 'roppyaku',
    800 => 'happyaku',
    3000 => 'sanzen',
    8000 => 'hassen',
    1000000000000 => 'itchou',
    8000000000000 => 'hatchou',
    10000000000000 => 'jutchou',
    10000000000000000 => 'ikkei',
    60000000000000000 => 'rokkei',
    80000000000000000 => 'hakkei',
    100000000000000000 => 'jukkei',
    1000000000000000000 => 'hyakkei'
);


if ($inputString > 10000) {
    $inp1 = floor($inputString / 1000);
    $inp = $inputString - ($inp1 * 1000);
    if($inp !== 0) {
        read($inp1, $numeralReadings, $numeralExceptions, false);
        read($inp, $numeralReadings, $numeralExceptions);
    } else {
        read($inputString, $numeralReadings, $numeralExceptions);
    }
} else {
    read($inputString, $numeralReadings, $numeralExceptions);
}

function read($inputStr, $numeralReadings, $numeralExceptions, $parse1 = true)
{
    $splitString = str_split($inputStr);
    $returnString = '';
    $appendIchi = false;
    $firstNumber = null;

    foreach ($splitString as $key => $number) {

        if ($firstNumber == null) {
            $firstNumber = $number;
        }

        if ($number !== 0) {
            $int = 1;
            $a = count($splitString) - 1 - $key;
            for ($i = 0; $i < $a; $i++) {
                $int = $int * 10;
            }

            $tempNumber = (int)$number * $int;
            if (isset($numeralExceptions[$tempNumber])) {
                $returnString .= $numeralExceptions[$tempNumber] . ' ';
                continue;
            }

            if (isset($numeralReadings[$tempNumber])) {
                if ($parse1 == false && $tempNumber == 1) {
                    continue;
                }
                $returnString .= $numeralReadings[$tempNumber] . ' ';
                continue;
            }

            if (isset($numeralReadings[(int)$number])) {
                if ($parse1 == false && $tempNumber == 1) {
                    continue;
                }
                $returnString .= $numeralReadings[(int)$number];
                if ($int !== 1) {
                    $returnString .= '-' . $numeralReadings[$int];
                }
                $returnString .= ' ';
            }
        }
    }

    echo $returnString;
}

这是一个显示正在运行的代码的小提琴。您可能想在线尝试一下。 Link

使用上面的代码,我能够实现除最后两个之外的所有上述示例。

谁能更好地解决这个问题?

【问题讨论】:

    标签: php


    【解决方案1】:

    这是我解决问题的想法:

    https://gist.github.com/ionutxp/11231521

    【讨论】:

    • 您能解释一下为什么您的解决方案更好吗?算法的概述会很有用,并且提到测试也会很方便!谢谢!
    • 你几乎接近实现。就像我一样。直到 2025 年的所有答案都是正确的,但是,10403, 41892, 80000000000000 仍然没有实现
    【解决方案2】:

    我想你可以在这里简单地使用array_key_exists()

    function read($inputStr, $numeralReadings, $numeralExceptions)
    {
        if(array_key_exists($inputStr, $numeralReadings))
        {
            return $numeralReadings[$inputStr];
        }
        else if(array_key_exists($inputStr, $numeralExceptions))
        {
            return $numeralExceptions[$inputStr];
        }
        else
        {
            return "not found";
        }
    }
    

    【讨论】:

    • array_key_exists() 是我最初能想到的最简单的方法,但是,您是否检查了所有示例。不是所有的都可以用 array_key_exits() 来实现。无论如何,我已经对您的代码进行了一些编辑,以便首先在异常中检查函数。
    猜你喜欢
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2021-10-16
    • 2010-12-19
    • 2010-11-19
    • 1970-01-01
    相关资源
    最近更新 更多