1. 程式人生 > >阿里應屆生招聘線上程式設計測驗

阿里應屆生招聘線上程式設計測驗

昨天報了阿里的應屆生招聘,報完需要去線上測評,只有一道線上程式設計,可以使用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); } }