赞
踩
目录
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
解题思路
- 定义两个指针
cur
和dest
。cur
用于遍历整个数组。dest
指向下一个非零元素应该放置的位置。- 初始化
dest
为-1
,这是因为我们需要在第一次找到非零元素时将其值赋给dest
并且增加dest
的值。
步骤说明
初始化:
cur
从0开始。dest
从-1开始(表示还没有遇到非零元素)。遍历数组:
- 使用循环遍历整个数组
nums
。- 对于数组中的每一个元素
nums[cur]
,检查它是否是非零元素。
- 如果
nums[cur]
不为0,则执行以下操作:
- 将
dest
加1。- 交换
nums[dest]
和nums[cur]
的值。结束条件:
- 当
cur
遍历完整个数组后,循环结束。结果:
- 所有的非零元素都已经被移动到了数组的前半部分,并保持了原有的顺序。
- 所有的0元素都被移动到了数组的后半部分。
具体代码
class Solution { public: void moveZeroes(vector<int>& nums) { for (int cur = 0, dest = -1; cur < nums.size(); cur++) { if (nums[cur]) { swap(nums[++dest], nums[cur]); } } } };
给你一个长度固定的整数数组 arr
,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。
解题思路
初始化变量
预处理:
复制与调整
步骤说明
初始化:
cur
从0开始。dest
从-1开始。n
是数组的长度。预处理:
- 使用循环遍历整个数组
arr
。- 如果
arr[cur]
是0,则dest
增加2;否则,dest
增加1。- 如果
dest
大于等于n-1
,则退出循环。特殊情况处理:
- 如果
dest
等于n
,说明最后一个位置应该是一个复制的0元素,需要将最后一个元素设置为0,并减少dest
的值以确保不会超出数组长度。- 减少
cur
的值以便在接下来的步骤中重新处理这个位置。复制与调整:
- 从
cur
开始向左遍历数组。- 如果
arr[cur]
不为0,则直接将arr[cur]
复制到dest
的位置。- 如果
arr[cur]
为0,则需要复制两次0元素到dest
的位置。- 在每一步之后减少
dest
的值,并且每次循环结束后减少cur
的值。结束条件:
- 当
cur
小于0 时,循环结束。
具体代码
class Solution { public: void duplicateZeros(vector<int>& arr) { int cur = 0, dest = -1, n = arr.size(); while (cur < n) { if (arr[cur]) dest++; else dest += 2; if (dest >= n - 1) break; cur++; } if (dest == n) { arr[n - 1] = 0; cur--; dest -= 2; } while (cur >= 0) { if (arr[cur]) arr[dest--] = arr[cur--]; else { arr[dest--] = 0; arr[dest--] = 0; cur--; } } } };
编写一个算法来判断一个数 n
是不是快乐数。
「快乐数」 定义为:
如果 n
是 快乐数 就返回 true
;不是,则返回 false
。
首先我们先证明:
对于任意正整数,通过上述过程要么最终变为 1,要么进入一个循环,而不会出现其他情况。(鸽巢原理)
证明过程
有限性:
- 假设初始数为
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/906220
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。