一、題目
有一個整形數組arr和一個大小為w的視窗從數組最左邊滑到最右邊,視窗每次向右邊滑一個位置。
例如,數組為[4,3,5,4,3,3,6,7],視窗大小為3時:
[4,3,5],4,3,3,6,7 視窗中最大值為5
4,[3,5,4],3,3,6,7 視窗中最大值為5
4,3,[5,4,3],3,6,7 視窗中最大值為5
4,3,5,[4,3,3],6,7 視窗中最大值為4
4,3,5,4,[3,3,6],7 視窗中最大值為6
4,3,5,4,3,[3,6,7] 視窗中最大值為7
如果數組的長度為n,視窗大小為w,則一共産生n-w+1個視窗的最大值。
二、解析
此題目的難度不大,屬于水題,是以具體過程不寫了,直接看下面的代碼即可!具體的解答也可以從下面源代碼的注釋中看到。
三、可運作代碼
import java.util.Arrays;
public class MaxArrOfWindow {
public static void main(String[] args) {
int[] arr = new int[] {4,3,5,4,3,3,6,7}; //定義一個數組
int w = 3; //定義一個變量n = 3,表示視窗的長度為3
int[] res = new int[arr.length-w+1]; //定義一個數組,用來擷取getArr函數傳回的值
MaxArrOfWindow maxArrOfWindow = new MaxArrOfWindow();
res = maxArrOfWindow.getArr(arr, w);
for(int i = 0;i<arr.length-w+1;i++) { //周遊列印結果
System.out.println(res[i]);
}
}
public static int[] getArr(int[] arr,int w) {
int n = arr.length; //定義一個變量n,并指派數組的長度
int[] res = new int[n-w+1]; //定義一個數組res,用來存取最後的最大值數組
int[] window = new int[w]; //定義一個數組window,用來放每次不同視窗的數值
for(int i = 0;i<n-w+1;i++) { //外層循環用來控制總視窗數
int m = i;
for(int j = 0;j<w;j++) { //内層循環用來控制每一次視窗内擷取最大值
window[j] = arr[m++];
}
Arrays.sort(window);
res[i] = window[w-1];
}
return res;
}
}
四、運作結果截圖

五、總結
這種題目屬于鍛煉了數組和循環的程式設計思想,難度簡單。如果大家有更好的方法,歡迎在下面評論!