在這篇文章中,我們將探索如何將陣列中的所有非零值向右移動,同時保持其相對順序。這個問題是一個常見的面試問題,測試你對陣列操作和演算法最佳化的理解。讓我們深入研究使用 Java 的解決方案。
如果您不熟悉基本的陣列概念,我建議您查看《Understanding Array Basics in Java: A Simple Guide》以快速入門!
給定一個整數數組,我們希望將所有非零值向右移動,同時保留它們的順序。零值應移至左側。
範例:
Input: [1, 2, 0, 3, 0, 0, 4, 0, 2, 9] Output: [0, 0, 0, 0, 1, 2, 3, 4, 2, 9]
我們將使用索引追蹤方法來解決這個問題。目標是從右到左迭代數組並將非零元素移動到正確的位置。
此方法的時間複雜度為 O(n),空間複雜度為 O(1),使其既高效又節省空間。
package arrays; // Time Complexity - O(n) // Space Complexity - O(1) public class ShiftNonZeroValuesToRight { private void shiftValues(int[] inputArray) { /* Variable to keep track of index position to be filled with Non-Zero Value */ int pointer = inputArray.length - 1; // If value is Non-Zero then place it at the pointer index for (int i = pointer; i >= 0; i--) { /* If there is a non-zero already at correct position, just decrement position */ if (inputArray[i] != 0) { if (i != pointer) { inputArray[pointer] = inputArray[i]; inputArray[i] = 0; } pointer--; } } // Printing result using for-each loop for (int i : inputArray) { System.out.print(i); } System.out.println(); } public static void main(String[] args) { // Test-Case-1 : Ending with a Non-Zero int input1[] = { 1, 2, 0, 3, 0, 0, 4, 0, 2, 9 }; // Test-Case-2 : Ending with Zero int input2[] = { 8, 5, 1, 0, 0, 5, 0 }; // Test-Case-3 : All Zeros int input3[] = { 0, 0, 0, 0 }; // Test-Case-4 : All Non-Zeros int input4[] = { 1, 2, 3, 4 }; // Test-Case-5 : Empty Array int input5[] = {}; // Test-Case-6 : Empty Array int input6[] = new int[5]; // Test-Case-7 : Uninitialized Array int input7[]; ShiftNonZeroValuesToRight classObject = new ShiftNonZeroValuesToRight(); classObject.shiftValues(input1); // Result : 0000123429 classObject.shiftValues(input2); // Result : 0008515 classObject.shiftValues(input3); // Result : 0000 classObject.shiftValues(input4); // Result : 1234 classObject.shiftValues(input5); // Result : classObject.shiftValues(input6); // Result : 00000 classObject.shiftValues(input7); // Result : Compilation Error - Array may not have been initialized } }
空數組:程式處理空數組而不引發異常。
未初始化的數組:取消未初始化數組的測試案例的註釋將導致編譯錯誤,這說明了數組初始化的重要性。
該程式提供了一種將陣列中的非零值向右移動的有效方法。這是一個很好的例子,說明了仔細的指針管理如何在時間和空間複雜性方面帶來最佳解決方案。
有關數組的另一個常見面試問題,請查看我之前的文章《向左移動非零值:常見數組面試問題-1》
如果您有任何疑問或建議,請隨時在下面留言。快樂編碼!
以上是右移非零值:公共數組面試問題 2的詳細內容。更多資訊請關注PHP中文網其他相關文章!