文章目录
- 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++
else
dest+=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;
}
};