BuildCastles(構建城堡)

honeymoose發表於2018-12-29

Charlemagne, the King of Frankie,

英文描述

請參考圖片中的說明。

WeChat%20Image_20181229002923.png?versio

中文描述

根據給出的陣列確定能夠蓋多少城堡。

思路和點評

我不能確定我的思路是正確的,也歡迎大家參與討論。

根據給出的陣列,因為有重複的值,我首先想到的是將給出的陣列進行一次過濾和處理,去掉重複的值。

例如,給出的陣列為:int[] A = { 2, 2, 3, 4, 3, 3, 2, 2, 1, 1, 2, 5 };,那麼我希望處理為:int[] A = { 2, 3, 4, 3, 2, 1, 2, 5 }; 去掉重複的值,因為重複的值在這裡沒有意義。

2018-12-29_0-50-29.jpg?version=1&modific

然後根據新的陣列進行判斷,需要判斷的是 2 個端點,你需要將 2 個端點考慮為 0。

那麼根據上面已經處理過的陣列,你在進行遍歷的時候,針對第一個值 2 ,你需要判讀左側的值和右側的值,因為預設左側的值一直為 0 ,那麼右側的值為 3 的話,那麼這裡需要 v 需要 +1;

第 2 個值,因為第二個值的左側,3 > 2, 但右側 3 < 4。因此這個值不適合。

第 3 個值,左側:4 > 3, 右側 4 >3 這個值是合適的。

從這裡我們找到的規律是,進行一次遍歷,找到,如果只的左側和右側同時小於這值,或者左側和右側都同時大於這個值,那麼這個值是合適的取值。

需要注意一個情況就是 {-3, -3},你初始化陣列的時候,這個值為 {-3},那麼這個地方是最少有一個合適的值。

原始碼

原始碼和有關程式碼的更新請訪問 GitHub:

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

測試類請參考:

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

程式碼思路請參考:

/**
	 * https://www.cwiki.us/display/ITCLASSIFICATION/Build+Castles
	 */
	@Test
	public void testBuildCastles() {

		// int[] A = { -3, -3 };
		int[] A = { 2, 2, 3, 4, 3, 3, 2, 2, 1, 1, 2, 5 };

		int h = 0;
		int v = 0;

		List<Integer> nList = new ArrayList<Integer>();

		// Rebuild List
		nList.add(A[0]);
		for (int i = 0; i < A.length - 1; i++) {

			if (A[i] != A[i + 1]) {
				nList.add(A[i + 1]);
			}

		}

		// LOOP List to find right location
		for (int i = 0; i < nList.size() - 1; i++) {

			// COUNT 0
			if (i == 0) {
				if (nList.get(i) < nList.get(i + 1)) {
					v++;
				}
			} else {
				if (nList.get(i) < nList.get(i - 1) && nList.get(i) < nList.get(i + 1)) {
					v++;
				}

				if (nList.get(i) > nList.get(i - 1) && nList.get(i) > nList.get(i + 1)) {
					h++;
				}
			}
		}

		if (nList.size() == 1) {
			h++;
		} else if (nList.size() > 2 && nList.get(nList.size() - 1) > nList.get(nList.size() - 2)) {
			h++;
		}

		// CHECK
		logger.debug("V - [{}]", v);
		logger.debug("H - [{}]", h);

		logger.debug("H + V - [{}]", (h + v));

	}

測試結果

上面程式的測試結果如下:

2018/12/29 00:43:16 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - V - [2]
2018/12/29 00:43:16 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - H - [2]
2018/12/29 00:43:16 DEBUG [com.ossez.codebank.interview.tests.WayfairTest] - H + V - [4]


相關文章