[LeetCode] Move Zeroes - 整数数组处理问题

简介:
目录:
1.Move Zeroes  - 数组0移到末尾 [顺序交换]
2.


一.Move Zeroes 


题目概述:
Given an arraynums, write a function to move all 0's to the end of it while maintaining the relative order of the non-zero elements.For example, givennums = [0, 1, 0, 3, 12], after calling your function,nums should be[1, 3, 12, 0, 0].
Note:
        1.You must do this in-place without making a copy of the array.
        2.Minimize the total number of operations.


解题方法:

题意是把数组nums中0的元素后置,同时不能采用赋值数组。两种方法:
        1.遇到是0的元素从数组最后向前存储并移位,遇到非0元素从前存储;
        2.推荐:从前往后查找,不是0的元素前移,并计算0的个数,后面的全置0。

我的代码:
方法一:Runtime: 28 ms

void moveZeroes(int* nums, int numsSize) {
    int endNum;        //从后计数0
    int startNum;      //从前计数非0
    int temp;
    int i,j;
    
    i = 0;
    startNum = 0;
    endNum = 0;
    while( (i+endNum) < numsSize ) {
        if(nums[i]==0) {
            //依次前移
            for(j=startNum; j<numsSize-endNum-1; j++) { //j少一个数
                nums[j] = nums[j+1];
            }
            nums[numsSize-endNum-1] = 0;
            endNum++;
        }
        else {
            nums[startNum] = nums[i];
            startNum++;
            i++;
        }
    }
}
方法二:Runtime: 8 ms
void moveZeroes(int* nums, int numsSize) {
    int count;   //计算0的个数
    int i,j;
    int n;
    
    n = 0;
    count = 0;
    for(i=0; i<numsSize; i++) {
        if(nums[i]==0) {
            count++;
        }
        else  {
            nums[n] = nums[i];
            n++;
        }
    }
    //后置0
    for(j=0; j<count; j++) {
        nums[n] = 0;
        n++;
    }
}



(By:Eastmount 2015-9-20 晚上8半     http://blog.csdn.net/eastmount/ )

目录
相关文章
|
2月前
|
存储
LeetCode整数反转
解决LeetCode上的整数反转问题的几种方法,包括错误的方法和优化后的解决方案,以及如何避免反转后的整数超出32位有符号整数范围的问题。
37 1
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
41 0
|
2月前
【LeetCode-每日一题】 删除排序数组中的重复项
【LeetCode-每日一题】 删除排序数组中的重复项
21 4
|
2月前
|
索引
Leetcode第三十三题(搜索旋转排序数组)
这篇文章介绍了解决LeetCode第33题“搜索旋转排序数组”的方法,该问题要求在旋转过的升序数组中找到给定目标值的索引,如果存在则返回索引,否则返回-1,文章提供了一个时间复杂度为O(logn)的二分搜索算法实现。
20 0
Leetcode第三十三题(搜索旋转排序数组)
|
2月前
【LeetCode】整数翻转
【LeetCode】整数翻转
16 1
|
2月前
|
算法 C++
Leetcode第53题(最大子数组和)
这篇文章介绍了LeetCode第53题“最大子数组和”的动态规划解法,提供了详细的状态转移方程和C++代码实现,并讨论了其他算法如贪心、分治、改进动态规划和分块累计法。
69 0
|
2月前
|
存储 C++
Leetcode第十二题(整数转罗马数字)
LeetCode第12题“整数转罗马数字”的解题方法,包括罗马数字的基本规则和特殊规则,以及如何使用C++实现整数到罗马数字的转换。
17 0
|
2月前
|
C++
Leetcode第十三题(罗马数字转整数)
这篇文章介绍了LeetCode第13题“罗马数字转整数”的解题方法,通过一个C++的类`Solution`中的`romanToInt`函数来实现,该函数使用哈希表和遍历字符串的方法,根据罗马数字的规则将输入的罗马数字字符串转换为对应的整数值。
53 0
|
2月前
|
算法 C++
Leetcode第八题(字符串转换整数(atoi))
这篇文章介绍了LeetCode上第8题“字符串转换整数(atoi)”的解题思路和C++的实现方法,包括处理前导空格、正负号、连续数字字符以及整数溢出的情况。
19 0
|
2月前
|
C++
【LeetCode 12】349.两个数组的交集
【LeetCode 12】349.两个数组的交集
18 0