将数组中的0全部移动到末尾
来源:互联网 发布:小米手机数据迁移应用 编辑:程序博客网 时间:2024/06/14 19:59
题目:Move Zeroes
描述:
Given an array nums, 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, given nums = [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.
翻译:
将数组中的所有0移动到末尾,并保持非0元素的顺序不改变。
比如[0,1,0,3,12]移动后的期望数组为[1,3,12,0,0]
小要求:
1、不能创建一个新的数组来做操作
2、尽量少的操作次数
答案:
public void moveZeroes(int[] nums) { int size = nums.length; int startIndex = 0;// 0元素开始的位置 int endIndex = 0;// 0元素结束的位置 int currentNum; int i= 0; // 第一步:找到第一个0元素开始的位置 // 并将第一个0元素的游标赋值给startIndex&endIndex while(i < size){ currentNum = nums[i]; if (currentNum == 0) { startIndex = i; endIndex = i; break; } ++i; } // 如果当前数组中没有找到0元素,则推出 if (nums[endIndex] != 0) return; // 将当前i的值加1;直接从刚才0元素位置的后一位置开始循环 ++i; while (i < size) { currentNum = nums[i]; if (currentNum == 0){//如果当前元素等于0,则将i值赋值给endIndex endIndex = i; } else { // 如果不为0 //则将当前元素赋值给nums[startIndex] // 并将当前位置的元素赋值为0 // startIndex和endIndex都加1; nums[startIndex] = currentNum; nums[i] = 0; ++startIndex; ++endIndex; } ++i; } }
算法解释
此算法的精髓在于:在循环遍历中将0元素全部集中起来,整体向后移位,但是由于连续的0元素都是相等的,因此就算往前移位,也只需要将最前面的0元素和连续0元素的结束位置的后一位元素进行调换,相当于整个0元素块都向后移动了一位。
由于数组中可能有多个0,因此,第一次循环的时候,就将第一个0元素找出,并且记录当前0元素的游标(此时0元素开始的游标和结束的游标相等),第二次循环的时候,直接从0元素结束的游标的后一位开始循环遍历,如果循环遍历过程中,遇到了0元素,则将0元素的结束游标+1;如果没有遇到0元素,则将0元素开始位置和当前位置的数进行置换,并且将0元素的开始游标和结束游标都+1。
- 将数组中的0全部移动到末尾
- 移动数组中的‘0’到数组末尾
- Move Zeroes 移动0的个数到数组末尾
- 【lintcode】用最高效的方式将数组中的0移动到数组的左边
- Android 将EditText光标移动到字符串末尾
- 移动光标到末尾
- 将input中的光标移动到文字的末尾后,怎么用js显示光标当前的位置?
- 写一函数将字符数组s1中的全部字符复制到字符数组s2中,不用strcpy函数
- 编写一个程序,将字符数组s2中的全部字符复制到字符数组s1中。不用strcpy函数。
- 算法_将一个数组中的数组合全部列出
- LeetCode-283. Move Zeroes (JAVA) 移动0到末尾
- JS往textarea的光标所在处添加文字+将光标移动到文字末尾
- 编写一个程序,将字符数组s2中的全部字符复制到s1中。即实现strcpy函数功能
- 怎么将ListBox中的数据全部存入一个数组中
- 将数组中的所有零移到数组末尾-代码实例
- 移动数组中的0
- Android EditText光标移动到文本框末尾
- Android EditText光标移动到文本框末尾
- C# WinForm控件、自定义控件整理(大全) (2013-01-31 00:16:31)
- transfer error: Invalid argument
- hibernate.hbm2ddl.auto配置详解
- CSS知识点总结
- jquery bootstrap下拉列表设置最大高度
- 将数组中的0全部移动到末尾
- 一个小时打造新闻app
- 缓存的简单实现例子
- 怎么创作歌曲
- OpenCV:YAML vs XML格式文件的读写操作
- [心得]程序设计语言实践之路第2版知识整理
- 第九周项目1-猴子选大王(数组版)
- Hive 建立 最简单的table 从 文件 导入数据 带 分区 参数 partitioned
- Spring MVC问题集锦