Count Up Down(上下计数) 原

这个题目是 Kayak 发布的代码挑战题目。

最简单的描述就是不使用循环,输出 0 到 5,然后同样不是会用循环的方式再次输出 5 到 0。

英文描述

Part 1

Write a program that counts in sequential order when given a start and end value - without using any iterative programing loops, i.e. while, for, do, for-each, etc.

You can assume that both the start and end values will always be positive and that the start value will always be less then the end value. There should only be one method with the following signature:

void countUp(int start, int end) { // All code exercise code should go here }

Here is example output with start=0 and end=5:

[ 0,1,2,3,4,5]

Part 2

Continuing with part 1 change the output of the test, so that it now prints out in sequential order to the end value (only once), but then also counts down to the start value.

Again, using no iterative loops, and assuming that both the start and end values will always be positive and that start value will always be less then the end value. There should only be one method with the following signature:

void countUpAndDown(int start, int end) { // All code exercise code should go here }

Here is example output with start=0 and end=5:

[0,1,2,3,4,5,4,3,2,1,0]

中文描述

这里我不按照原文一字一字的翻译,但是尽量按照题目的要求把题目解释清楚。

最简单的描述就是不使用循环,输出 0 到 5,然后同样不是会用循环的方式再次输出 5 到 0。

本题目分 2 部分,第一部分是不使用循环的方式输出 0 到 5,第二部分是不使用循环的方式输出 0 到 5 以后,再输出 5 到 0。

其中需要注意的是 5 只能输出一次。

思路和点评

不使用 For 循环的方式输出 0 到 5 ,我们可以想到有几个方法。

第一个方法可能比较容易想到的就是递归调用,你可以根据输入的值,递归调用需要的次数就可以输出值了。你还可以采用计算机时钟的方式进行输出。

在这里我们采用递归调用的方式进行输出。

源代码

源代码和有关代码的更新请访问 GitHub:

https://github.com/cwiki-us/codebank-algorithm/blob/master/src/main/java/com/ossez/codebank/interview/KayakCountUpDown.java

测试类请参考:

https://github.com/cwiki-us/codebank-algorithm/blob/master/src/test/java/com/ossez/codebank/interview/tests/KayakTest.java

代码思路请参考:

package com.ossez.codebank.interview;

import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 
 * https://www.cwiki.us/display/ITCLASSIFICATION/Count+Up+Down
 * 
 * @author YuCheng
 *
 */
public class KayakCountUpDown {
  private final static Logger logger = LoggerFactory.getLogger(KayakCountUpDown.class);

  static int minNumber = 0;
  static int maxNumber = 0;
  int tmpN = 0;
  List<Integer> retList = new ArrayList<Integer>();

  /**
   * 
   * @param start
   * @param end
   * @return
   */
  public List<Integer> countUp(int start, int end) {
    logger.debug("BEGIN");
    maxNumber = end;
    tmpN = start;
    moveUp(0);
    retList.add(end);
    return retList;

  }

  /**
   * 
   * @param start
   * @param end
   * @return
   */
  public List<Integer> countUpDown(int start, int end) {
    logger.debug("BEGIN");
    minNumber = start;
    maxNumber = end;
    tmpN = start;

    moveUp(0);
    retList.add(end);

    moveDown(1);
    return retList;

  }

  /**
   * 
   * @param n
   */
  private void moveUp(int n) {
    retList.add(tmpN);
    tmpN++;
    if (tmpN != maxNumber) {
      moveUp(tmpN + 1);
    }

  }

  /**
   * 
   * @param n
   */
  private void moveDown(int n) {
    tmpN = (maxNumber - n);
    retList.add(tmpN);

    if (tmpN != minNumber) {
      moveDown(n + 1);
    }
  }

}

测试结果

上面程序的测试结果如下:

2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - TEST Count Up and Down  2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - [2 -> 5] 2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.KayakCountUpDown] - BEGIN 2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - UP - [2, 3, 4, 5] 2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.KayakCountUpDown] - BEGIN 2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - UP & DOWN - [2, 3, 4, 5, 4, 3, 2] 2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - [0 -> 5] 2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.KayakCountUpDown] - BEGIN 2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - UP - [0, 1, 2, 3, 4, 5] 2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.KayakCountUpDown] - BEGIN 2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - UP & DOWN - [0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0] 2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - [-1 -> 5] 2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.KayakCountUpDown] - BEGIN 2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - UP - [-1, 0, 1, 2, 3, 4, 5] 2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.KayakCountUpDown] - BEGIN 2018/12/25 21:23:54 DEBUG [com.ossez.codebank.interview.tests.KayakTest] - UP & DOWN - [-1, 0, 1, 2, 3, 4, 5, 4, 3, 2, 1, 0, -1]

https://www.cwiki.us/display/ITCLASSIFICATION/Count+Up+Down

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏加米谷大数据

5G时代来了,你要换手机就吗?

12月8日中移动董事长尚冰在全球合作伙伴大会上透露,将会增加5G设备及网络建设的资金投放,计划于2019年开始5G预商用,并于明年上半年推出5G智能手机和首批中...

9520
来自专栏网络安全防护

企业遭到DDoS攻击可以通过哪些手段进行防御?

DDoS攻击是现在最常见的一种网络攻击方式,主要通过大规模流量攻击目标服务器,导致服务器性能耗尽而崩溃。随着5G时代的到来,DDoS攻击的数量和规模都越来越大。...

25100
来自专栏加米谷大数据

2018十大网络用语,你用过几个?

事情出现了意想不到的转折,我们可以用来突出它很调皮,常用于微博上具有反转性的搞笑内容

20920
来自专栏FreeBuf

使用HackCube-Special分析滚动码信号

所谓滚动码(Rolling code)是我们嗅探汽车遥控发射出来的射频信号,发现每一次的射频信号都是不一样的,并且每个信号只能被使用一次,这就是被称为滚动码的原...

36120
来自专栏用户2119464的专栏

CentOS7 安装 Web 服务(Nginx)

37720
来自专栏加米谷大数据

大数据发展的八大方向!

大数据的应用,目前集中体现在互联网与金融两个领域,当人们满足了物质层面的需求,可能会将目光转向更加贴近生活的层面,目前,“大数据”一词正在越来越频繁的出现,越来...

16630
来自专栏数据饕餮

胖子哥的大数据之路(12)-三张图告诉你大数据安全方案设计

  最近一直很忙,在做一个全国性项目的IT架构,所以一直没有更新,好在算是告一段落,继续努力吧。项目沟通中过程客户反复在强调,大数据的安全性,言下之意,用了大数...

13930
来自专栏华章科技

5G的未来投资机会在哪里?(附中国5G产业发展与投资报告全文)

导读:日前,为了更好地以资本助推5G产业发展,中国移动投资公司与中国移动研究院联合发布了《洞见5G,投资未来——中国5G产业发展与投资报告》,分析了5G对生产和...

19220
来自专栏高性能服务器开发

网络编程基础漫谈(一)之 bind 函数

其中 bind 的地址我们使用了一个宏叫 INADDR_ANY ,关于这个宏的解释如下:

46520
来自专栏FreeBuf

思科全球产品管理高级总监Kevin Skahill | FIT2019独家专访

在FIT 2019「全球高峰会」现场,他带来了《数字化时代基于意图的自动化安全网络架构》主题演讲。

10940

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励