文章目录
- 1、移动零
- 2、复写零
- 3、快乐数
- 4、盛最多水的容器
1、移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
class Solution {
public:void moveZeroes(vector<int>& nums) {int n=nums.size();int cur=0;int dest=-1;while(cur<n){if(nums[cur]==0)cur++;else{swap(nums[dest+1],nums[cur]);cur++;dest++;}}}
};
2、复写零
给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。
注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。
class Solution {
public:void duplicateZeros(vector<int>& arr) {int n = arr.size();//从前往后会覆盖数据,所以就需要从后往前//在开始之前需要找到最后需要复写的位置int cur = 0;int dest = -1;while (cur < n)//分为四部,1、先对cur进行判断,{ //2、进行判断dest走几步,判断走几步是通过cur位置的结果决定的if(arr[cur]) //3、判断dest位置dest++; //4、cur++elsedest+=2;if(dest>=n-1)break;cur++;}if (dest==n){arr[n - 1] = 0;dest -= 2;cur -= 1;}while (cur >= 0){arr[dest] = arr[cur];if (arr[cur] == 0)arr[--dest] = 0;cur--;dest--;}}
};
3、快乐数
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」 定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false 。
class Solution {
public:int assist(int n){int sum=0;while(n>0){int dummy=n%10;n/=10;sum+=pow(dummy,2);}return sum;}//快慢指针bool isHappy(int n) {int slow=n;int fast=assist(n);while(slow!=fast){slow=assist(slow);fast=assist(assist(fast));}return slow==1;}
};
4、盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。
找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
返回容器可以储存的最大水量。
说明:你不能倾斜容器。
class Solution {
public:int maxArea(vector<int>& height) {int n=height.size();int left=0;int right=n-1;int maxi=0;while(left<right){if(height[left]>height[right]){int sum=(right-left)*height[right];maxi=max(maxi,sum);right--;}else{int sum=(right-left)*height[left];maxi=max(maxi,sum);left++;}}return maxi;}
};