📜  从数组中删除一个元素(使用两次遍历和一次遍历)

📅  最后修改于: 2021-04-28 18:27:22             🧑  作者: Mango

给定一个数组和一个数字“ x”,编写一个函数从给定的数组中删除“ x”。我们假设数组维护着两件事,即容量和大小。因此,当我们删除一个项目时,容量不会改变,只有大小会改变。
例子:

Input:  arr[] = {3, 1, 2, 5, 90}, x = 2, size = 5, capacity = 5
Output: arr[] = {3, 1, 5, 90, _}, size = 4, capacity = 5

Input:  arr[] = {3, 1, 2, _, _}, x = 2, size = 3, capacity = 5
Output: arr[] = {3, 1, _, _, _}, size = 4, capacity = 5
 

方法1(先搜索,然后删除)
我们首先在数组中搜索“ x”,然后在x右侧的元素向后搜索一个位置。以下是此简单方法的实现。

C++
// C++ program to remove a given element from an array
#include
using namespace std;
 
// This function removes an element x from arr[] and
// returns new size after removal (size is reduced only
// when x is present in arr[]
int deleteElement(int arr[], int n, int x)
{
// Search x in array
int i;
for (i=0; i


Java
// Java program to remove a given element from an array
import java.io.*;
 
class Deletion {
     
    // This function removes an element x from arr[] and
    // returns new size after removal (size is reduced only
    // when x is present in arr[]
    static int deleteElement(int arr[], int n, int x)
    {
        // Search x in array
        int i;
        for (i=0; i


Python3
# Python 3 program to remove a given
# element from an array
 
# This function removes an element x
# from arr[] and returns new size after
# removal (size is reduced only when x
# is present in arr[]
def deleteElement(arr, n, x):
     
    # Search x in array
    for i in range(n):
        if (arr[i] == x):
            break
 
    # If x found in array
    if (i < n):
         
        # reduce size of array and move
        # all elements on space ahead
        n = n - 1;
        for j in range(i, n, 1):
            arr[j] = arr[j + 1]
 
    return n
 
# Driver Code
if __name__ == '__main__':
    arr = [11, 15, 6, 8, 9, 10]
    n = len(arr)
    x = 6
 
    # Delete x from arr[]
    n = deleteElement(arr, n, x)
 
    print("Modified array is")
    for i in range(n):
        print(arr[i], end = " ")
         
# This code is contributed by
# Shashank_Sharma


C#
// C# program to remove a given element from
// an array
using System;
 
class GFG {
     
    // This function removes an element x
    // from arr[] and returns new size
    // after removal (size is reduced only
    // when x is present in arr[]
    static int deleteElement(int []arr,
                              int n, int x)
    {
         
        // Search x in array
        int i;
        for (i = 0; i < n; i++)
            if (arr[i] == x)
                break;
 
        // If x found in array
        if (i < n)
        {
             
            // reduce size of array and
            // move all elements on
            // space ahead
            n = n - 1;
            for (int j = i; j < n; j++)
                arr[j] = arr[j+1];
        }
 
        return n;
    }
     
    // Driver program to test above function
    public static void Main()
    {
        int []arr = {11, 15, 6, 8, 9, 10};
        int n = arr.Length;
        int x = 6;
 
        // Delete x from arr[]
        n = deleteElement(arr, n, x);
 
        Console.WriteLine("Modified array is");
        for (int i = 0; i < n; i++)
            Console.Write(arr[i]+" ");
         
    }
}
 
// This code is contributed by nitin mittal.


Javascript


C++
// C++ program to remove a given element from an array
#include
using namespace std;
 
// This function removes an element x from arr[] and
// returns new size after removal.
// Returned size is n-1 when element is present.
// Otherwise 0 is returned to indicate failure.
int deleteElement(int arr[], int n, int x)
{
   // If x is last element, nothing to do
   if (arr[n-1] == x)
       return (n-1);
 
   // Start from rightmost element and keep moving
   // elements one position ahead.
   int prev = arr[n-1], i;
   for (i=n-2; i>=0 && arr[i]!=x; i--)
   {
       int curr = arr[i];
       arr[i] = prev;
       prev = curr;
   }
 
   // If element was not found
   if (i < 0)
     return 0;
 
   // Else move the next element in place of x
   arr[i] = prev;
 
   return (n-1);
}
 
/* Driver program to test above function */
int main()
{
    int arr[] = {11, 15, 6, 8, 9, 10};
    int n = sizeof(arr)/sizeof(arr[0]);
    int x = 6;
 
    // Delete x from arr[]
    n = deleteElement(arr, n, x);
 
    cout << "Modified array is \n";
    for (int i=0; i


Java
// Java program to remove a given element from an array
import java.io.*;
 
class Deletion
{
    // This function removes an element x from arr[] and
    // returns new size after removal.
    // Returned size is n-1 when element is present.
    // Otherwise 0 is returned to indicate failure.
    static int deleteElement(int arr[], int n, int x)
    {
        // If x is last element, nothing to do
        if (arr[n-1] == x)
            return (n-1);
 
        // Start from rightmost element and keep moving
        // elements one position ahead.
        int prev = arr[n-1], i;
        for (i=n-2; i>=0 && arr[i]!=x; i--)
        {
            int curr = arr[i];
            arr[i] = prev;
            prev = curr;
        }
 
        // If element was not found
        if (i < 0)
            return 0;
 
        // Else move the next element in place of x
        arr[i] = prev;
 
        return (n-1);
    }
 
    // Driver program to test above function
    public static void main(String[] args)
    {
        int arr[] = {11, 15, 6, 8, 9, 10};
        int n = arr.length;
        int x = 6;
 
        // Delete x from arr[]
        n = deleteElement(arr, n, x);
 
        System.out.println("Modified array is");
        for (int i = 0; i < n; i++)
            System.out.print(arr[i]+" ");
 
    }
}
/*This code is contributed by Devesh Agrawal*/


Python3
# python program to remove a given element from an array
 
 
# This function removes an element x from arr[] and
# returns new size after removal.
# Returned size is n-1 when element is present.
# Otherwise 0 is returned to indicate failure.
def deleteElement(arr,n,x):
 
    # If x is last element, nothing to do
    if arr[n-1]==x:
        return n-1
 
    # Start from rightmost element and keep moving
   # elements one position ahead.
 
    prev = arr[n-1]
    for i in range(n-2,1,-1):
        if arr[i]!=x:
            curr = arr[i]
            arr[i] = prev
            prev = curr
 
    # If element was not found
    if i<0:
        return 0
 
    # Else move the next element in place of x
    arr[i] = prev
    return n-1
 
 
# Driver code
arr = [11,15,6,8,9,10]
n = len(arr)
x = 6
n = deleteElement(arr,n,x)
print("Modified array is")
for i in range(n):
    print(arr[i],end=" ")
 
# This code is contributed by Shrikant13


C#
// C# program to remove a given
// element from an array
using System;
class GFG {
     
    // This function removes an
    // element x from arr[] and
    // returns new size after
    // removal. Returned size is
    // n-1 when element is present.
    // Otherwise 0 is returned to
    // indicate failure.
    static int deleteElement(int []arr,
                             int n,
                             int x)
    {
         
        // If x is last element,
        // nothing to do
        if (arr[n - 1] == x)
            return (n - 1);
 
        // Start from rightmost
        // element and keep moving
        // elements one position ahead.
        int prev = arr[n - 1], i;
        for (i = n - 2; i >= 0 &&
                arr[i] != x; i--)
        {
            int curr = arr[i];
            arr[i] = prev;
            prev = curr;
        }
 
        // If element was
        // not found
        if (i < 0)
            return 0;
 
        // Else move the next
        // element in place of x
        arr[i] = prev;
 
        return (n - 1);
    }
 
    // Driver Code
    public static void Main()
    {
        int []arr = {11, 15, 6, 8, 9, 10};
        int n = arr.Length;
        int x = 6;
 
        // Delete x from arr[]
        n = deleteElement(arr, n, x);
 
        Console.WriteLine("Modified array is");
        for(int i = 0; i < n; i++)
            Console.Write(arr[i]+" ");
 
    }
}
 
// This code is contributed by anuj_67.


输出:

Modified array is
11 15 8 9 10

方法2(在搜索时移动元素)
此方法假定元素始终存在于数组中。这个想法是从最右边的元素开始,并在搜索“ x”的同时保持移动元素。以下是此方法的C++和Java实现。请注意,当数组中不存在“ x”时,此方法可能会产生意外结果。

C++

// C++ program to remove a given element from an array
#include
using namespace std;
 
// This function removes an element x from arr[] and
// returns new size after removal.
// Returned size is n-1 when element is present.
// Otherwise 0 is returned to indicate failure.
int deleteElement(int arr[], int n, int x)
{
   // If x is last element, nothing to do
   if (arr[n-1] == x)
       return (n-1);
 
   // Start from rightmost element and keep moving
   // elements one position ahead.
   int prev = arr[n-1], i;
   for (i=n-2; i>=0 && arr[i]!=x; i--)
   {
       int curr = arr[i];
       arr[i] = prev;
       prev = curr;
   }
 
   // If element was not found
   if (i < 0)
     return 0;
 
   // Else move the next element in place of x
   arr[i] = prev;
 
   return (n-1);
}
 
/* Driver program to test above function */
int main()
{
    int arr[] = {11, 15, 6, 8, 9, 10};
    int n = sizeof(arr)/sizeof(arr[0]);
    int x = 6;
 
    // Delete x from arr[]
    n = deleteElement(arr, n, x);
 
    cout << "Modified array is \n";
    for (int i=0; i

Java

// Java program to remove a given element from an array
import java.io.*;
 
class Deletion
{
    // This function removes an element x from arr[] and
    // returns new size after removal.
    // Returned size is n-1 when element is present.
    // Otherwise 0 is returned to indicate failure.
    static int deleteElement(int arr[], int n, int x)
    {
        // If x is last element, nothing to do
        if (arr[n-1] == x)
            return (n-1);
 
        // Start from rightmost element and keep moving
        // elements one position ahead.
        int prev = arr[n-1], i;
        for (i=n-2; i>=0 && arr[i]!=x; i--)
        {
            int curr = arr[i];
            arr[i] = prev;
            prev = curr;
        }
 
        // If element was not found
        if (i < 0)
            return 0;
 
        // Else move the next element in place of x
        arr[i] = prev;
 
        return (n-1);
    }
 
    // Driver program to test above function
    public static void main(String[] args)
    {
        int arr[] = {11, 15, 6, 8, 9, 10};
        int n = arr.length;
        int x = 6;
 
        // Delete x from arr[]
        n = deleteElement(arr, n, x);
 
        System.out.println("Modified array is");
        for (int i = 0; i < n; i++)
            System.out.print(arr[i]+" ");
 
    }
}
/*This code is contributed by Devesh Agrawal*/

Python3

# python program to remove a given element from an array
 
 
# This function removes an element x from arr[] and
# returns new size after removal.
# Returned size is n-1 when element is present.
# Otherwise 0 is returned to indicate failure.
def deleteElement(arr,n,x):
 
    # If x is last element, nothing to do
    if arr[n-1]==x:
        return n-1
 
    # Start from rightmost element and keep moving
   # elements one position ahead.
 
    prev = arr[n-1]
    for i in range(n-2,1,-1):
        if arr[i]!=x:
            curr = arr[i]
            arr[i] = prev
            prev = curr
 
    # If element was not found
    if i<0:
        return 0
 
    # Else move the next element in place of x
    arr[i] = prev
    return n-1
 
 
# Driver code
arr = [11,15,6,8,9,10]
n = len(arr)
x = 6
n = deleteElement(arr,n,x)
print("Modified array is")
for i in range(n):
    print(arr[i],end=" ")
 
# This code is contributed by Shrikant13

C#

// C# program to remove a given
// element from an array
using System;
class GFG {
     
    // This function removes an
    // element x from arr[] and
    // returns new size after
    // removal. Returned size is
    // n-1 when element is present.
    // Otherwise 0 is returned to
    // indicate failure.
    static int deleteElement(int []arr,
                             int n,
                             int x)
    {
         
        // If x is last element,
        // nothing to do
        if (arr[n - 1] == x)
            return (n - 1);
 
        // Start from rightmost
        // element and keep moving
        // elements one position ahead.
        int prev = arr[n - 1], i;
        for (i = n - 2; i >= 0 &&
                arr[i] != x; i--)
        {
            int curr = arr[i];
            arr[i] = prev;
            prev = curr;
        }
 
        // If element was
        // not found
        if (i < 0)
            return 0;
 
        // Else move the next
        // element in place of x
        arr[i] = prev;
 
        return (n - 1);
    }
 
    // Driver Code
    public static void Main()
    {
        int []arr = {11, 15, 6, 8, 9, 10};
        int n = arr.Length;
        int x = 6;
 
        // Delete x from arr[]
        n = deleteElement(arr, n, x);
 
        Console.WriteLine("Modified array is");
        for(int i = 0; i < n; i++)
            Console.Write(arr[i]+" ");
 
    }
}
 
// This code is contributed by anuj_67.

输出:

Modified array is
11 15 8 9 10

即使给定要删除元素的索引,从数组中删除元素也要花费O(n)时间。对于排序的数组,时间复杂度也保持为O(n)。
在链表中,如果我们知道要删除的节点的上一个节点的指针,则可以在O(1)时间内进行删除。