In this post, we'll explore how to shift all non-zero values in an array to the right while maintaining their relative order. This problem is a common interview question that tests your understanding of array manipulation and algorithm optimization. Let's dive into the solution using Java.
If you're unfamiliar with basic array concepts, I recommend checking out Understanding Array Basics in Java: A Simple Guide to get up to speed!
Given an array of integers, we want to shift all non-zero values to the right while preserving their order. The zero values should be moved to the left.
Example:
Input: [1, 2, 0, 3, 0, 0, 4, 0, 2, 9] Output: [0, 0, 0, 0, 1, 2, 3, 4, 2, 9]
We’ll use an index-tracking approach to solve this problem. The goal is to iterate through the array from right to left and shift non-zero elements to their correct positions.
This approach has a time complexity of O(n) and a space complexity of O(1), making it both efficient and space-saving.
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 } }
Empty Arrays: The program handles empty arrays without throwing an exception.
Uninitialized Arrays: Uncommenting the test case for uninitialized arrays will result in a compilation error, demonstrating the importance of array initialization.
This program provides an efficient way to shift non-zero values to the right in an array. It is a great example of how careful pointer management can lead to optimal solutions in terms of both time and space complexity.
For another common interview question on arrays, check out my previous post on Shifting Non-Zero Values Left: A Common Array Interview Problem-1
If you have any questions or suggestions, feel free to leave a comment below. Happy coding!
The above is the detailed content of Shifting Non-Zero Values Right : A Common Array Interview Problem-2. For more information, please follow other related articles on the PHP Chinese website!