文章目錄
- 前言
- 題目描述(華為校招真題)
- 解題思路分析
- Java 實現代碼
- 單元測試代碼
- 結語
前言
在各大互聯網公司的算法面試中,數組類題目一直是考察的重點,尤其是對于應屆生和初級工程師的面試來說更是常見題型。華為作為國內頂尖的科技企業,在校招和社招中也經常考察這類基礎但極具代表性的題目。本題“最長連續遞增子序列”是一道典型的數組遍歷與狀態維護問題,雖然難度適中,但卻能很好地考察候選人對邊界條件的處理能力、邏輯思維的嚴謹性以及代碼的簡潔性和可讀性。
題目描述(華為校招真題)
給定一個無重復元素的整數數組 nums,返回最長連續遞增子序列的長度。
連續遞增子序列定義為:數組中連續的一段元素 [i, i+1, i+2, …, j],滿足 nums[i] < nums[i+1] < … < nums[j]。
示例:
輸入: nums = [1,3,5,4,7]
輸出: 3
解釋: 最長的連續遞增子序列是 [1, 3, 5],長度為 3。輸入: nums = [2,2,2,2]
輸出: 1
解釋: 每個元素都是獨立的遞增序列。
解題思路分析
我們可以采用一次遍歷的方式解決該問題
1、初始化兩個變量maxLength(記錄最長遞增序列的長度)、currentLength(當前遞增序列的長度);
2、從第二個元素開始遍歷數組如果當前元素大于前一個元素,則 currentLength++,否則重置 currentLength = 1,每次更新 maxLength;
3、算法時間復雜度:O(n),空間復雜度:O(1)
Java 實現代碼
/*** LongestContinuousIncreasingSubsequence* @author senfel* @version 1.0* @date 2025/7/23 11:54*/
public class LongestContinuousIncreasingSubsequence {/*** findLengthOfLCIS* @param nums* @author senfel* @date 2025/7/23 11:55 * @return int*/public int findLengthOfLCIS(int[] nums) {// 驗證是否為空if (nums == null || nums.length == 0) {return 0;}//最長遞增序列的長度int maxLength = 1;//當前遞增序列的長度int currentLength = 1;for (int i = 1; i < nums.length; i++) {if (nums[i] > nums[i - 1]) {currentLength++;maxLength = Math.max(maxLength, currentLength);} else {currentLength = 1;}}return maxLength;}
}
單元測試代碼
/*** LongestContinuousIncreasingSubsequenceTest* @author senfel* @version 1.0* @date 2025/7/23 12:02*/
public class LongestContinuousIncreasingSubsequenceTest {private final LongestContinuousIncreasingSubsequence solution = new LongestContinuousIncreasingSubsequence();@Testpublic void testBasicCase1() {int[] nums = {1, 3, 5, 4, 7};assertEquals(3, solution.findLengthOfLCIS(nums));}@Testpublic void testAllSameElements() {int[] nums = {2, 2, 2, 2};assertEquals(1, solution.findLengthOfLCIS(nums));}@Testpublic void testEmptyArray() {int[] nums = {};assertEquals(0, solution.findLengthOfLCIS(nums));}@Testpublic void testSingleElement() {int[] nums = {5};assertEquals(1, solution.findLengthOfLCIS(nums));}@Testpublic void testFullyIncreasing() {int[] nums = {1, 2, 3, 4, 5};assertEquals(5, solution.findLengthOfLCIS(nums));}@Testpublic void testMultipleSegments() {int[] nums = {1, 2, 5, 3, 4, 6, 2, 3, 4, 5};assertEquals(4, solution.findLengthOfLCIS(nums));}
}
結語
這道題是華為校招中常考的基礎算法題之一,雖然難度不高,但能考察候選人的代碼簡潔性、邊界處理能力、單元測試意識等多方面素質。建議大家在練習時不僅要寫出正確代碼,在實際的面試過程中注意編寫完整的單元測試,并考慮邊界情況(空數組、單個元素、全等元素)盡量寫出可讀性強的代碼。