将第一个元素加倍并将零移动到结尾
对于给定的 n 个整数数组,并假设 '0' 是一个无效数字,而所有其他数字都是一个有效数字。以这样的方式转换数组,如果当前和下一个元素都有效并且都具有相同的值,则将当前值加倍并将下一个数字替换为 0。修改后,重新排列数组,使所有 0 都移到末尾。
例子:
Input : arr[] = {2, 2, 0, 4, 0, 8}
Output : 4 4 8 0 0 0
Input : arr[] = {0, 2, 2, 2, 0, 6, 6, 0, 0, 8}
Output : 4 2 12 8 0 0 0 0 0 0
来源:微软 IDC 面试经历 |设置 150。
方法:首先如前所述修改数组,即如果下一个有效数字与当前数字相同,则将其值加倍并将下一个数字替换为0。
修改算法:
1. if n == 1
2. return
3. for i = 0 to n-2
4. if (arr[i] != 0) && (arr[i] == arr[i+1])
5. arr[i] = 2 * arr[i]
6. arr[i+1] = 0
7. i++
修改数组后,将所有零移动到数组的末尾。
C++
// C++ implementation to rearrange the array
// elements after modification
#include
using namespace std;
// function which pushes all zeros to end of
// an array.
void pushZerosToEnd(int arr[], int n)
{
// Count of non-zero elements
int count = 0;
// Traverse the array. If element encountered
// is non-zero, then replace the element at
// index 'count' with this element
for (int i = 0; i < n; i++)
if (arr[i] != 0)
// here count is incremented
arr[count++] = arr[i];
// Now all non-zero elements have been shifted
// to front and 'count' is set as index of
// first 0. Make all elements 0 from count
// to end.
while (count < n)
arr[count++] = 0;
}
// function to rearrange the array elements
// after modification
void modifyAndRearrangeArr(int arr[], int n)
{
// if 'arr[]' contains a single element
// only
if (n == 1)
return;
// traverse the array
for (int i = 0; i < n - 1; i++) {
// if true, perform the required modification
if ((arr[i] != 0) && (arr[i] == arr[i + 1])) {
// double current index value
arr[i] = 2 * arr[i];
// put 0 in the next index
arr[i + 1] = 0;
// increment by 1 so as to move two
// indexes ahead during loop iteration
i++;
}
}
// push all the zeros at the end of 'arr[]'
pushZerosToEnd(arr, n);
}
// function to print the array elements
void printArray(int arr[], int n)
{
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
}
// Driver program to test above
int main()
{
int arr[] = { 0, 2, 2, 2, 0, 6, 6, 0, 0, 8 };
int n = sizeof(arr) / sizeof(arr[0]);
cout << "Original array: ";
printArray(arr, n);
modifyAndRearrangeArr(arr, n);
cout << "\nModified array: ";
printArray(arr, n);
return 0;
}
Java
// Java implementation to rearrange the
// array elements after modification
class GFG {
// function which pushes all
// zeros to end of an array.
static void pushZerosToEnd(int arr[], int n)
{
// Count of non-zero elements
int count = 0;
// Traverse the array. If element
// encountered is non-zero, then
// replace the element at index
// 'count' with this element
for (int i = 0; i < n; i++)
if (arr[i] != 0)
// here count is incremented
arr[count++] = arr[i];
// Now all non-zero elements
// have been shifted to front and
// 'count' is set as index of first 0.
// Make all elements 0 from count to end.
while (count < n)
arr[count++] = 0;
}
// function to rearrange the array
// elements after modification
static void modifyAndRearrangeArr(int arr[], int n)
{
// if 'arr[]' contains a single element
// only
if (n == 1)
return;
// traverse the array
for (int i = 0; i < n - 1; i++) {
// if true, perform the required modification
if ((arr[i] != 0) && (arr[i] == arr[i + 1]))
{
// double current index value
arr[i] = 2 * arr[i];
// put 0 in the next index
arr[i + 1] = 0;
// increment by 1 so as to move two
// indexes ahead during loop iteration
i++;
}
}
// push all the zeros at
// the end of 'arr[]'
pushZerosToEnd(arr, n);
}
// function to print the array elements
static void printArray(int arr[], int n)
{
for (int i = 0; i < n; i++)
System.out.print(arr[i] + " ");
System.out.println();
}
// Driver program to test above
public static void main(String[] args)
{
int arr[] = { 0, 2, 2, 2, 0, 6, 6, 0, 0, 8 };
int n = arr.length;
System.out.print("Original array: ");
printArray(arr, n);
modifyAndRearrangeArr(arr, n);
System.out.print("Modified array: ");
printArray(arr, n);
}
}
// This code is contributed
// by prerna saini
Python3
# Python3 implementation to rearrange
# the array elements after modification
# function which pushes all zeros
# to end of an array.
def pushZerosToEnd(arr, n):
# Count of non-zero elements
count = 0
# Traverse the array. If element
# encountered is non-zero, then
# replace the element at index
# 'count' with this element
for i in range(0, n):
if arr[i] != 0:
# here count is incremented
arr[count] = arr[i]
count+=1
# Now all non-zero elements have been
# shifted to front and 'count' is set
# as index of first 0. Make all
# elements 0 from count to end.
while (count < n):
arr[count] = 0
count+=1
# function to rearrange the array
# elements after modification
def modifyAndRearrangeArr(ar, n):
# if 'arr[]' contains a single
# element only
if n == 1:
return
# traverse the array
for i in range(0, n - 1):
# if true, perform the required modification
if (arr[i] != 0) and (arr[i] == arr[i + 1]):
# double current index value
arr[i] = 2 * arr[i]
# put 0 in the next index
arr[i + 1] = 0
# increment by 1 so as to move two
# indexes ahead during loop iteration
i+=1
# push all the zeros at the end of 'arr[]'
pushZerosToEnd(arr, n)
# function to print the array elements
def printArray(arr, n):
for i in range(0, n):
print(arr[i],end=" ")
# Driver program to test above
arr = [ 0, 2, 2, 2, 0, 6, 6, 0, 0, 8 ]
n = len(arr)
print("Original array:",end=" ")
printArray(arr, n)
modifyAndRearrangeArr(arr, n)
print("\nModified array:",end=" ")
printArray(arr, n)
# This code is contributed by Smitha Dinesh Semwal
C#
// C# implementation to rearrange the
// array elements after modification
using System;
class GFG {
// function which pushes all
// zeros to end of an array.
static void pushZerosToEnd(int[] arr, int n)
{
// Count of non-zero elements
int count = 0;
// Traverse the array. If element
// encountered is non-zero, then
// replace the element at index
// 'count' with this element
for (int i = 0; i < n; i++)
if (arr[i] != 0)
// here count is incremented
arr[count++] = arr[i];
// Now all non-zero elements
// have been shifted to front and
// 'count' is set as index of first 0.
// Make all elements 0 from count to end.
while (count < n)
arr[count++] = 0;
}
// function to rearrange the array
// elements after modification
static void modifyAndRearrangeArr(int[] arr, int n)
{
// if 'arr[]' contains a single element
// only
if (n == 1)
return;
// traverse the array
for (int i = 0; i < n - 1; i++) {
// if true, perform the required modification
if ((arr[i] != 0) && (arr[i] == arr[i + 1])) {
// double current index value
arr[i] = 2 * arr[i];
// put 0 in the next index
arr[i + 1] = 0;
// increment by 1 so as to move two
// indexes ahead during loop iteration
i++;
}
}
// push all the zeros at
// the end of 'arr[]'
pushZerosToEnd(arr, n);
}
// function to print the array elements
static void printArray(int[] arr, int n)
{
for (int i = 0; i < n; i++)
Console.Write(arr[i] + " ");
Console.WriteLine();
}
// Driver program to test above
public static void Main()
{
int[] arr = { 0, 2, 2, 2, 0, 6, 6, 0, 0, 8 };
int n = arr.Length;
Console.Write("Original array: ");
printArray(arr, n);
modifyAndRearrangeArr(arr, n);
Console.Write("Modified array: ");
printArray(arr, n);
}
}
// This code is contributed by Sam007
Javascript
C++
// Utility Function For Swapping Two Element Of An Array
void swap(int& a, int& b) { a = b + a - (b = a); }
// shift all zero to left side of an array
void shiftAllZeroToLeft(int array[], int n)
{
// Maintain last index with positive value
int lastSeenNonZero = 0;
for (index = 0; index < n; index++)
{
// If Element is non-zero
if (array[index] != 0)
{
// swap current index, with lastSeen non-zero
swap(array[index], array[lastSeenNonZero]);
// next element will be last seen non-zero
lastSeenNonZero++;
}
}
}
// This snippet is contributed By: Faizanur Rahman
Java
class GFG {
// Function For Swapping Two Element Of An Array
public static void swap(int[] A, int i, int j)
{
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
// shift all zero to left side of an array
static void shiftAllZeroToLeft(int array[], int n)
{
// Maintain last index with positive value
int lastSeenNonZero = 0;
for (int index = 0; index < n; index++) {
// If Element is non-zero
if (array[index] != 0) {
// swap current index, with lastSeen
// non-zero
swap(array, array[index],
array[lastSeenNonZero]);
// next element will be last seen non-zero
lastSeenNonZero++;
}
}
}
}
// This code is contributed By sam_2200
Python3
# Maintain last index with positive value
def shiftAllZeroToLeft(arr, n):
lastSeenNonZero = 0
for index in range(0, n):
# If Element is non-zero
if (array[index] != 0):
# swap current index, with lastSeen
# non-zero
array[index], array[lastSeenNonZero] = array[lastSeenNonZero], array[index]
# next element will be last seen non-zero
lastSeenNonZero++
# This code is contributed By sam_2200
C#
using System;
class GFG
{
// Function For Swapping Two Element Of An Array
public static void swap(int[] A, int i, int j)
{
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
// shift all zero to left side of an array
static void shiftAllZeroToLeft(int[] array, int n)
{
// Maintain last index with positive value
int lastSeenNonZero = 0;
for (int index = 0; index < n; index++)
{
// If Element is non-zero
if (array[index] != 0)
{
// swap current index, with lastSeen
// non-zero
swap(array, array[index],
array[lastSeenNonZero]);
// next element will be last seen non-zero
lastSeenNonZero++;
}
}
}
}
// This code is contributed By Saurabh Jaiswal
Javascript
输出:
Original array: 0 2 2 2 0 6 6 0 0 8
Modified array: 4 2 12 8 0 0 0 0 0 0
时间复杂度:O(n)。
具有有效零位偏移的方法:
虽然上述解决方案是有效的,但我们可以通过减少操作次数来进一步优化移位零算法。
在上述移位算法中,当我们将计数索引到最后一个索引元素设置为零时,我们会扫描一些元素两次。
高效的零移位算法:
int lastSeenPositiveIndex = 0;
for( index = 0; index < n; index++)
{
if(array[index] != 0)
{
swap(array[index], array[lastSeenPositiveIndex]);
lastSeenPositiveIndex++;
}
}
C++
// Utility Function For Swapping Two Element Of An Array
void swap(int& a, int& b) { a = b + a - (b = a); }
// shift all zero to left side of an array
void shiftAllZeroToLeft(int array[], int n)
{
// Maintain last index with positive value
int lastSeenNonZero = 0;
for (index = 0; index < n; index++)
{
// If Element is non-zero
if (array[index] != 0)
{
// swap current index, with lastSeen non-zero
swap(array[index], array[lastSeenNonZero]);
// next element will be last seen non-zero
lastSeenNonZero++;
}
}
}
// This snippet is contributed By: Faizanur Rahman
Java
class GFG {
// Function For Swapping Two Element Of An Array
public static void swap(int[] A, int i, int j)
{
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
// shift all zero to left side of an array
static void shiftAllZeroToLeft(int array[], int n)
{
// Maintain last index with positive value
int lastSeenNonZero = 0;
for (int index = 0; index < n; index++) {
// If Element is non-zero
if (array[index] != 0) {
// swap current index, with lastSeen
// non-zero
swap(array, array[index],
array[lastSeenNonZero]);
// next element will be last seen non-zero
lastSeenNonZero++;
}
}
}
}
// This code is contributed By sam_2200
Python3
# Maintain last index with positive value
def shiftAllZeroToLeft(arr, n):
lastSeenNonZero = 0
for index in range(0, n):
# If Element is non-zero
if (array[index] != 0):
# swap current index, with lastSeen
# non-zero
array[index], array[lastSeenNonZero] = array[lastSeenNonZero], array[index]
# next element will be last seen non-zero
lastSeenNonZero++
# This code is contributed By sam_2200
C#
using System;
class GFG
{
// Function For Swapping Two Element Of An Array
public static void swap(int[] A, int i, int j)
{
int temp = A[i];
A[i] = A[j];
A[j] = temp;
}
// shift all zero to left side of an array
static void shiftAllZeroToLeft(int[] array, int n)
{
// Maintain last index with positive value
int lastSeenNonZero = 0;
for (int index = 0; index < n; index++)
{
// If Element is non-zero
if (array[index] != 0)
{
// swap current index, with lastSeen
// non-zero
swap(array, array[index],
array[lastSeenNonZero]);
// next element will be last seen non-zero
lastSeenNonZero++;
}
}
}
}
// This code is contributed By Saurabh Jaiswal
Javascript