LeetCode283移动零问题java高效解法

前端之家收集整理的这篇文章主要介绍了LeetCode283移动零问题java高效解法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

一、题目:

  1. 给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
    示例:
      输入: [0,1,3,12]
      输出: [1,12,0]
    说明:
      1.必须在原数组上操作,不能拷贝额外的数组。
      2.尽量减少操作次数

二、思路:

  1. 分为两种情况:
      1.第一位(即L指针指的地方为0):当R指针所指数字为0时,R指针右移;否则交换左右指针位置,左右指针同时右移;
      2.第一位不为0:同理,当R指针为0时,L指针右移,否则首先左指针右移,再交换位置,右指针右移.

三、代码实现:

  1. class Solution {
  2. public void moveZeroes(int[] nums) {
  3. int L = 0;
  4. int R = 1;
  5. while (R <= nums.length - 1){
  6. if (nums[L] == 0){
  7. if (nums[R] == 0){
  8. R++;
  9. }else {
  10. int temp = nums[L];
  11. nums[L] = nums[R];
  12. nums[R] = temp;
  13. R++;
  14. L++;
  15. }
  16. }else {
  17. if (nums[R] == 0) {
  18. R++;
  19. } else {
  20. L++;
  21. int temp = nums[L];
  22. nums[L] = nums[R];
  23. nums[R] = temp;
  24. R++;
  25. }
  26. }
  27. }
  28. }

  1. /**方法二:
    * 取出非零元素,加入数组,再赋值给原数组,后面的数字赋值为0.
    * @param nums
    */
    public void moveZeroes2(int[] nums) {
    List<Integer> tempArr = new ArrayList<>();
    for (int i = 0; i < nums.length; i++) {
    if (nums[i] != 0){
    tempArr.add(nums[i]);
    }
    }
    for (int i = 0; i < tempArr.size(); i++) {
    nums[i] = tempArr.get(i);
    }
    for (int i = tempArr.size() + 1; i < nums.length; i++) {
    nums[i] = 0;
    }
    }


    //方法三:
    public void moveZeroes3(int[] nums) {
    int j = 0;
    for(int i = 0;i<nums.length;i++){
    //如果当前元素不为目标元素:将nums[j] 赋给 nums[i],j++(后移)
    if(nums[i] != 0){
    nums[j] = nums[i];
    j++;
    }
    //反则:i++.
    }
    }
  1. }

 

运行效果

 

 

 

  1.  

猜你在找的算法相关文章