代码改变世界

把一个整数数组中所有的非0整数移到左边

2014-12-12 17:52  李涛的技术博客  阅读(404)  评论(0编辑  收藏  举报

1、一个整数数组,把非0的整数移到左边,对整数的顺序不做要求。写一个函数实现,并返回数组的非0整数个数。不使用额外的存储。比如:

初始数组为:[ 1, 0, 2, 0, 0, 3, 4 ],处理后的数组是:[ 4, 1, 3, 2, 0, 0, 0 ],函数返回非0整数的个数4。

解答:两个指针,一个从左向右移动,一个从右向左移动。

int moveLeft(int* arr, int len)
{
    if (arr == NULL || len <= 0)
        return -1;
    int i = 0;
    int j = len - 1;
    while (i <= j)
    {
        if (arr[i] != 0)
        {
            if (arr[j] == 0)
            {
                j--;
            }
            i++;
        }
        else
        {
            if (arr[j] != 0)
            {
                arr[i] = arr[j];
                arr[j] = 0;
                i++;
            }
            j--;
        }
    }
    return i;
}                        

2、假设数组长度为N,有M个0,需要多少次交换。

min(M, N-M)