阿里應屆生招聘線上程式設計測驗
阿新 • • 發佈:2019-01-04
昨天報了阿里的應屆生招聘,報完需要去線上測評,只有一道線上程式設計,可以使用IDE。
題目
小猴子下山,沿著下山的路由一排桃樹,每棵樹都結了一些套子。小猴子想摘桃子,但是有一些條件需要遵守,小猴子只能沿著下山的方向走,不能回頭,每棵樹最多摘一個,而且一旦摘了一棵樹的桃子,就不能再摘比這棵樹結的桃子少的樹上的桃子了,那麼小猴子最多能摘幾個桃子呢?舉例說明,比如有5課樹,分別結了10,4,5,12,8顆桃子,那麼小猴子最多能摘3顆桃子,來自於結了4,5,8顆桃子的樹。
思路
看完這道題,就知道其實是求一個數組最大遞增子序列。以前做過求最大公共子串的題,想必應該差不多,應該都是跟之前的比較,result[j] = result[i] + 1(result[j]>result[i])這樣。
思路好像挺清晰的,而且以前也做過類似的題。。但是好久沒刷演算法,最後的結果居然是沒有做出來 = =
好慘,交卷了仔細想想才發現迴圈條件寫錯了一個,關鍵答案上寫的還是我題目看錯的那個程式。GG
為了找工作還是好好準備了一下的,也不知道最後能走到哪一步,好好加油吧!
下面貼上後來寫的(應該是正確的,不過也沒有題目可以測試了。。)
package test;
import java.util.Scanner;
/**
* Created by Fly on 2017/7/25.
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int length = scanner.nextInt();
int[] nums = new int[length];
for (int i = 0; i < length; i++) {
nums[i] = scanner.nextInt();
}
//記錄每個位置最長遞增子序列的長度
int[] result = new int[length];
for (int i = 0; i < length; i++) {
result[i] = 1 ;//從1開始
for (int j = 0; j < i; j++) {
//如果是i位置大於j位置,並且j位置的最長遞增子序列的長度+1長於目前i位置的最長遞增子序列的長度,則更新i位置的最長遞增子序列
if (nums[j] <= nums[i] &&
result[j] + 1 > result[i]) {
result[i] = result[j] + 1;
}
}
}
int max = 1;
for (int i : result)
max = i > max ? i : max;
System.out.println(max);
}
}