移动数组中的元素(检查是否为0)

时间:2018-01-01 19:21:15

标签: c

我必须创建一个函数来检查数组中是否有0,以及是否将它们移动到数组的开头,例如 0 4 0 8 9 - &gt ; 0 0 4 8 9 ,我尝试过使用此功能

void movement(int a[],int n)
{    
     int temp,k=0,i;

    for(i=n-1;i>=0;i--)
    {
        if(a[i]==0);
        {
           k++;
           a[i]=a[i-1];
        }
        for(i=1;i<k;i++)
        {
            a[i]=0;
        }
    }

}

然而它不起作用,任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:2)

就你所说的你实际上不需要排序而言,你只需要将0移动到数组的开头。

在这种情况下,只需通过数组一次,使用teseconindex变量存储非零的最低索引。教你在零存储的零指数处找到0替换项目的时间,并将其递增。

for(size_t ndx = 0, zeroNdx = 0; count> ndx; ++ndx)
{
  if(!arr[ndx])

    arr[ndx] = arr[ndxZero];
    arr[ndxZero++] = 0;
  }  {
}

如果你真的需要排序,这还不够。

答案 1 :(得分:2)

在阵列之间移动元素是昂贵的,所以我使用临时阵列。这是一个示例:

#include <stdio.h>
int main()
{
    int array[]={0,1,2,0,3,0,0};
    int temp[100];
    int i,count=0;
    for(i=0;i<=6;i++){
        if(array[i]==0){
            temp[count]=array[i]; //copy all zero into temp first
            count++;
        }
    }   
    for(i=0;i<=6;i++)
    {
        if(array[i]!=0 && count<=6)
        {

            temp[count]=array[i]; //fill other elements other than 0
             count++;
        }
    }
    printf("%d\n",temp[6]);
    for(i=0;i<=6;i++){
        printf("%d ",temp[i]);
    }
}

o / p:0 0 0 0 1 2 3

答案 2 :(得分:1)

你可以这样做:

void movement(int a[],int n)
{
 int temp,k=0,i;

    for (i = 0; i < n; i++)
    {
        if (a[i] != 0)
        {
            if (a[k] == 0)
                    k++;
        }
        else
        {
            if (a[k] != 0)
            {
                temp = a[i];
                a[i] = a[k];
                a[k] = temp;
            }
            k++;
        }
    }
}

这会在数组的开头移动数组中的所有0。复杂性 - O(n),只有一个通过给定的数组,不需要额外的空间。

答案 3 :(得分:0)

这应该只需要稍微复杂一点:

public float speed = 10.0F;
public float RotSpeed = 150.0F;
public float minY = 0.0f;
public float maxY = 90.0f;
float forwardBackward;
float leftRight;
float RotLeftRight;
float RotUpDown;
Vector3 euler;

public void CameraRotate()
{
    transform.localEulerAngles = euler;
    // Getting axes
    RotLeftRight = Input.GetAxis("Mouse X") * RotSpeed * Time.deltaTime;
    RotUpDown = Input.GetAxis("Mouse Y") * -RotSpeed * Time.deltaTime;

    // Doing movements
    euler.y += RotLeftRight;

    euler.x += RotUpDown;

    LimitRotation ();
}

public void LimitRotation()
{
    if(euler.x >= maxY)
        euler.x = maxY;
    if(euler.x <= minY)
        euler.x = minY;
}