登录  /  注册
php - 日本雅虎程序员跳槽程序测试问题
PHPz
PHPz 2017-04-10 15:36:19
[PHP讨论组]

一救援机器人有三种跳跃模式,可分别跳跃1m,2m,3m的距离,请用程序实现该机器人行进n米路程时可用的跳跃方式。
程序语言不限,当距离n值足够大时,程序执行时间尽量小。

例:当距离为4米时,输出结果有7种:

1m,1m,1m,1m
1m,1m,2m
1m,2m,1m
1m,3m
2m,1m,1m
2m,2m
3m,1m
PHPz
PHPz

学习是最好的投资!

全部回复(14)
PHPz

根据 @AUV_503516 的思路, 写以下代码, 存储结构和空间还可以优化

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
#
# @file     robot_steps_calculator.py 
# @author   kaka_ace
# @date     Mar 27 2015
# @breif     
#

import copy

class RobotBrain(object):
    CACHE_INIT = {
        1: [['1']],
        2: [['1', '1'], ['2']],
        3: [['1', '1' ,'1'], ['1', '2'], ['2', '1'], ['3']],
    }

    CACHE_KEY_MAP_INIT = dict() # 缓存如 '11', '21' etc. 去重作用
    for k, v in CACHE_INIT.items():
        for l in v:
            s = "".join(l)
            CACHE_KEY_MAP_INIT[s] = True

    def __init__(self):
        self.cache = copy.deepcopy(self.CACHE_INIT)
        self.cache_key_map = copy.deepcopy(self.CACHE_KEY_MAP_INIT)

    def output_solution(self, n: "total length, positive number") -> None:
        if n <= 3:
            print(RobotBrain._ouput_result(self.cache[n]))
            return

        i = 4
        while i <= n:
            """
            f(i) = 1 + f(i-1)
                 = 2 + f(i-2)
                 = 3 + f(i-3)

                 = f(i-1) + 1
                 = f(i-2) + 2
                 = f(i-3) + 3

                we need to remove duplicates
            """
            self.cache[i] = []
            for step in range(1, 4):
                self._add_to_cache(1, i, True)
                self._add_to_cache(2, i, True)
                self._add_to_cache(3, i, True)

                self._add_to_cache(1, i, False)
                self._add_to_cache(2, i, False)
                self._add_to_cache(3, i, False)

            i += 1

        self._ouput_result(self.cache[n])

    def _add_to_cache(self, delta: int, i: int, reverse: bool) -> None:
        for sl in self.cache[i-delta]:
            s = ''.join(sl)
            delta_str = str(delta)
            if reverse is True:
                # delta + f(i - delta)
                new_key = delta_str + s
            else:
                # f(i - delta) + delta
                new_key = s + delta_str

            if new_key not in self.cache_key_map:
                self.cache_key_map[new_key] = True
                self.cache[i].append([delta_str] + sl)

    @staticmethod
    def _ouput_result(cache_list) -> None:
        for cache_result in cache_list:
            print(",".join([i+"m" for i in cache_result]))


if __name__ == "__main__":
    r = RobotBrain()
    r.output_solution(5)

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号