1. 程式人生 > >Count Up Down(上下計數)

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