LeetCode Hot 热题100 算法题 283.移动零-算法&测试-easy模式
程序员文章站
2024-03-22 14:26:10
...
LeetCode Hot 热题100 算法题 283.移动零-算法&测试-easy模式
给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。
示例:[0,2,0,3,12]
输出:[2,3,12,0,0]
必须在原数组上操作,不能拷贝额外的数组
尽量减少操作次数
package leetcode.easy;
import java.util.Arrays;
public class Solution283 {
public static void main(String[] args) {
int[] nums = {0,2,0,3,12};
S283MoveZero testMoveZero = new S283MoveZero();
System.out.println(Arrays.toString(testMoveZero.moveZeroes(nums)));
}
}
class S283MoveZero{
//法1:双指针i j
//每当i指向非零数时,将i所指值 与 j所指值 交换,并将j后移;
public int[] move0(int[] nums) {
int temp=0;
int j=0;//j的前面都是非零数
for (int i = 0; i < nums.length; i++) {
//只要i指向的数不为0 就将i所指数与j所指的数交换
if (nums[i]!=0) {
temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
j++;//j后移
}
}
return nums;
}
//法2:双指针i j
//每当i指向非零数时,将i所指值赋给j所指值 并将j后移;
//当i遍历完数组元素时,j指针的前部已经还原了所有非零数,将 从j指向的的数 到数组最后的数都置为0
public int[] moveZero(int[] nums) {
int j = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
nums[j] = nums[i];
j++;
}
}
while (j<nums.length) {
nums[j]=0;
j++;
}
return nums;
}
//法3:
public int[] moveZeroes(int[] nums) {
int n=nums.length;
int left=0;
int right=0;
while(right<n) {
if (nums[right]!=0) {
swap(nums, left, right);
left++;
}
right++;
}
return nums;
}
public void swap(int[] nums,int left,int right) {
int temp=nums[left];
nums[left]=nums[right];
nums[right]=temp;
}
}
参考:
- https://leetcode-cn.com/problems/move-zeroes/solution/dong-hua-yan-shi-283yi-dong-ling-by-wang_ni_ma
- https://leetcode-cn.com/problems/move-zeroes/solution/yi-dong-ling-by-leetcode-solution
上一篇: 寻找数组中第K大的数
推荐阅读
-
LeetCode Hot 热题100 算法题 234.回文链表-算法&测试-easy模式
-
LeetCode Hot 热题100 算法题 283.移动零-算法&测试-easy模式
-
LeetCode Hot 热题100 算法题 160.相交链表-算法&测试-easy模式
-
LeetCode Hot 热题100 算法题 141.环形链表-算法&测试-easy模式
-
LeetCode Hot 热题100 算法题 1.两数之和 -算法&测试-easy模式
-
LeetCode Hot 热题100 算法题 461.汉明距离-算法&测试-easy模式
-
LeetCode Hot 热题100 算法题 206.反转链表-算法&测试-easy模式
-
LeetCode Hot 热题100 算法题 169.多数元素-算法&测试-easy模式