考研两三题
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)!