Given an array of integers arr, return true if and only if it is a valid mountain array.
Recall that arr is a mountain array if and only if:
arr.length >= 3- There exists some
iwith0 < i < arr.length - 1such that:arr[0] < arr[1] < ... < arr[i - 1] < arr[i]arr[i] > arr[i + 1] > ... > arr[arr.length - 1]

Example 1:
Input: arr = [2,1] Output: false
Example 2:
Input: arr = [3,5,5] Output: false
Example 3:
Input: arr = [0,3,2,1] Output: true
Constraints:
1 <= arr.length <= 1040 <= arr[i] <= 104
var validMountainArray = function(arr) {
if (arr.length < 3) return false
let onTop = false
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i] === arr[i+1]) {
return false
}
if (i > 0 && arr[i] > arr[i+1]) {
onTop = true
}
if (!onTop && arr[i] >= arr[i+1]) {
return false
}
if (onTop && arr[i] <= arr[i+1]) {
return false
}
}
return true && onTop
};
基礎, 但是有趣。
常常覺得,寫程式就像交代一個工人做事。
這個工人很酷,絕對會按照你交代的事情去完成,不會去糾正你,也不怎麼會變通。但是絕對按照你的吩咐。
所以在解決問題時,我會先用自己聽得懂的語言對自己說一次,或是寫在紙上。這個很適合示範一下。
以這題為例,該怎麼判斷是不是山形的陣列:
1. 檢查每個數字吧: 寫了第一個迴圈
var validMountainArray = function(arr) {
for (let i = 0; i < arr.length - 1; i++) {
}
};
2. 如果陣列的內容只有兩個,不可能是山形。
var validMountainArray = function(arr) {
// 陣列長度不可以小於 3
if (arr.length < 3) return false
for (let i = 0; i < arr.length - 1; i++) {
}
};
3. 如果連續出現兩個一樣的數字,也可以排除。
var validMountainArray = function(arr) {
if (arr.length < 3) return false
for (let i = 0; i < arr.length - 1; i++) {
// 續出現兩個一樣的數字,排除
if (arr[i] === arr[i+1]) {
return false
}
}
};
4. 接下來的判斷要分成兩個部分,登上山頂前,和登上山頂後。 做一個參數來記錄是不是登上山頂了。
var validMountainArray = function(arr) {
if (arr.length < 3) return false
// 做一個參數來記錄是不是登上山頂了
let onTop = false
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i] === arr[i+1]) {
return false
}
}
};
5. 怎麼樣算登上山頂呢? 不是第一個數字而且開始下坡。
var validMountainArray = function(arr) {
if (arr.length < 3) return false
let onTop = false
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i] === arr[i+1]) {
return false
}
// 不能是第一個數字 i > 0
// 下一個數字開始下降 arr[i] > arr[i+1]
if (i > 0 && arr[i] > arr[i+1]) {
onTop = true
}
}
};
6. 登上山頂前,數字要一直上升,登上山頂後數字要一直下降。 通過這些檢核就算合格。
var validMountainArray = function(arr) {
if (arr.length < 3) return false
let onTop = false
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i] === arr[i+1]) {
return false
}
if (i > 0 && arr[i] > arr[i+1]) {
onTop = true
}
// 登頂前,數字要一直上升
if (!onTop && arr[i] >= arr[i+1]) {
return false
}
// 登頂後,數字要一直下降
if (onTop && arr[i] <= arr[i+1]) {
return false
}
}
// 通過這些檢核就算合格
return true
};
7. 檢視一下是否少了什麼。 沒錯,如果陣列是 [1, 2, 3, 4],可以閃過我們的檢核,因為他一直保持 onTop 在 false 的狀態,也一直處於數字上升。 因此,必須在最後增加一個條件,必須要完成登頂的動作。
var validMountainArray = function(arr) {
if (arr.length < 3) return false
let onTop = false
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i] === arr[i+1]) {
return false
}
if (i > 0 && arr[i] > arr[i+1]) {
onTop = true
}
if (!onTop && arr[i] >= arr[i+1]) {
return false
}
if (onTop && arr[i] <= arr[i+1]) {
return false
}
}
// 必須要完成過登頂這件事
return onTop && true
};
呼,總算大功告成。 先用自己的話交代一遍,總是能很快的寫出解決的雛形,接下來就是內建函式的熟練度和經驗。
透過不斷解題的過程中,慢慢的也會改變自己看待事物的看法,解決日常生活事件的方式。
