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

目录
相关文章
|
3月前
|
SQL 人工智能 IDE
代码提速10倍,交付只快18%:AI编程的效率悖论到底卡在哪
AI编程虽让写代码快10倍,但仅占交付20%,整体提速仅约18%。瓶颈在需求翻译、代码质量、后续流程等非编码环节。真正提效的关键,是将AI融入完整交付链路——结构化需求、统一规范、自动校验、协同落地,而非单纯加速“写代码”。
|
4月前
|
人工智能 自然语言处理 小程序
创建你的第一个小程序:使用阿里云万小智AI建站一句话生成小程序(图文教程)
阿里云万小智2.0支持自然语言对话生成微信小程序:输入需求描述→自动生成PRD→构建应用→预览编辑→绑定账号→发布上线,全程零代码,快速交付。阿里云万小智官网:https://t.aliyun.com/U/FmBHHe
736 0
|
4月前
|
存储 弹性计算 人工智能
2026年阿里云ECS云服务器配置价格表与性能测评
阿里云ECS云服务器作为弹性计算核心产品,2026年持续优化配置、价格与性能,覆盖个人开发、中小企业应用、企业级高负载等全场景。以下从配置分类、价格体系、性能实测、选型建议四方面展开详解,帮助用户精准匹配需求。
681 0
|
4月前
|
存储 人工智能 多模数据库
大模型时代数据库角色转型实战:从RAG检索增强到AI Agent数据底座的架构思考
本文探讨大模型时代数据库角色的深刻转变:从数据存储转向AI底座。详解RAG如何依赖向量数据库实现知识增强,Agent如何依托数据库实现记忆持久化与上下文管理,以及多模数据库如何支撑AI Agent的工具调用与执行。DBA需扩展向量检索、多模存储等新能力,而非被替代。(239字)
|
5月前
|
机器人 数据安全/隐私保护 开发者
钉钉机器人接入 OpenClaw 全攻略教程
本文详解OpenClaw接入钉钉企业内部机器人的全流程:从创建应用、开通机器人能力、配置Stream模式(免公网域名),到获取Client ID/Secret并对接网关。涵盖前置准备、图文操作步骤及关键注意事项,助力高效实现业务信息实时同步与团队协作升级。
|
5月前
|
存储 消息中间件 传感器
数据仓库是什么?数据仓库和ODS、数据集市有什么区别?
本文厘清数据仓库架构中三大核心概念:ODS(操作型数据存储)是贴源、低延迟的数据缓冲区;数据仓库(DW)是面向主题、集成、非易失的中央分析平台;数据集市(DM)是面向部门、轻度汇总的主题小库。三者构成“采集—整合—服务”闭环,是企业数据架构的基石。
|
6月前
|
JSON 安全 Java
【SpringSecurity新手村系列】(6)基于角色的权限控制、权限拦截注解与自定义无权限页面
本章在 RBAC 角色体系上,开启 @EnableMethodSecurity,使用 @PreAuthorize 配合 hasRole / hasAnyRole 实现 Controller 方法级拦截,并配置自定义 403 无权限页面,重点拆解 ROLE_ 前缀重复拼接的常见坑位。
506 1
|
4月前
|
人工智能 NoSQL 关系型数据库
【MySQL百日打怪升级第22天】事务死锁的成因与避免 —— 死锁检测、锁等待超时
【MySQL死锁精讲】第22天干货:剖析死锁成因(循环加锁)、检测机制(等待图算法)、四大场景(转账/外键/Gap Lock等)及实战避坑方案——统一加锁顺序、缩短事务、合理选隔离级别,附AI诊断工具箱。
369 0
|
6月前
|
Windows
PE启动盘制作与启动教程 Windows版:NTFS格式化+一键制作+双模式引导指南
本教程指导如何将≥8GB U盘格式化为NTFS,并使用PE工具箱制作WinPE启动盘:解压工具、以管理员身份运行,选择U盘写入PE系统,完成后生成EFI隐藏分区,支持系统维护与重装。(239字)
1725 0
|
数据库 项目管理 安全
AVEVA Plant(PDMS)数据库的保护
AVEVA Plant(PDMS)数据库的保护 eryar@163.com   以下内容摘自一网友邮件: ----- Original Message ----- Sent: Tuesday, September 25, 2012 9:46 PM Subject: PDMS项目管理 你好,看了你写的很多文章,大部分都是关于程序出图的设置,我想咨询你一个关于PDMS项目管理的问题,希望能够赐教。
2696 0

热门文章

最新文章