自学内容网 自学内容网

考研两三题

283. 移动零 - 力扣(LeetCode)


本题解法:使用双指针

解法一:

如上图,在一开始slow指向-1,fast指向数组起始位,进入while循环,保证fast不越界,因为代码中fast会自增,因此fast要小于num.size()-1。

解法二:

如上图,如果fast不为0就交换slow下一个位置和fast;如果fast为0就让fast独自自增。

1089. 复写零 - 力扣(LeetCode)


如上图,解题思想:先定义一个快慢指针,找到最后一个要复写的数据,然后从后往前开始复写。

  • 找最后一个复写数据:fast为0,slow后移2;不为0,后移1;判断slow是否到数组最后位置,fast自增。
  • 11行:判断slow是否越界,当slow等于nums大小时就可以结束循环。
  • 16行:这是一个特殊情况:当slow=nums.size时,slow恰好指向数组越界后的第一个数据,这是因为要复写的数据刚好是0。
  • 23行:通过while循环从后往前复写数据。

如上图,当第五次操作之后,此时slow就越界,这就是特殊情况。本来要放两个0,现在只需要将数组最后一个位置置为0,然后fast自减即可。

27. 移除元素 - 力扣(LeetCode) 


本题解法:快慢指针;

这里的else内部的逻辑类似移动零的解法二中的swap逻辑。既能够使数据交换,也能够进行遍历。保证了slow之前的数据全是非val的(也就是不符合if条件的),slow到fast之间的数据全是val,fast之后的数据全是待判断的。


原文地址:https://blog.csdn.net/qq_61847875/article/details/143869247

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!