【C++每日一练】双指针 力扣(202,283,1080)
2023-12-28 22:39:08
力扣202 快乐数
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int bitSum(int n)//计算每一位的平方和函数
{
int sum = 0;
while (n)
{
int t = n % 10;
sum += t * t;
n /= 10;
}
return sum;
}
bool isHappy(int n)
{
int fast = bitSum(n);//因为是快慢指针,判断条件又是fast!=slow,如果相等无法循环
//所以赋值fast为slow的下一个数字,又因为在环内一定会相遇,所以不会死循环
int slow = n;
while (slow != fast)
{
slow = bitSum(slow);//模拟慢指针走一步的特征
fast = bitSum(bitSum(fast));//模拟快指针走两步的特征
}
return slow == 1;//如果为1为true,不为1为falst;
}
};
力扣283 移动零
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
//[1,3,0,0,123,42,12,2,3]
void moveZeroes(vector<int>& nums)
{
for (int dest = -1, cur = 0; cur < nums.size(); cur++)
{
if (nums[cur] != 0)//当cur不等于0时,将desc++与cur交换,使得desc位置的0不断后移,如同推箱子
{
dest++;
swap(nums[cur], nums[dest]);
}
}
}
力扣1080 复写0
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<vector>
using namespace std;
//因为从前向后遍历会覆盖数据,所以这道题需要从后向前赋值
class Solution {
public:
void duplicateZeros(vector<int>& arr)
{
int cur = 0, desc = -1;//定义指针,从前向后遍历,确认cur最终位置
int n = arr.size();
while (cur < n) {
if (arr[cur]) {
desc++;
}
else {
desc += 2;
}
if (desc >= n - 1)//如果desc==n或者大于n,证明越界.立刻终止循环
break;
cur++;
}
if (desc == n)//desc只有等于零的结果
{
arr[n - 1] = 0;//修正复写
cur--; desc -= 2;//修正指针
}
while (cur >= 0)//正常循环,如果cur为1正常复制
{
if (arr[cur])
arr[desc--] = arr[cur--];
else//如果为零,desc赋值0,cur正常减
{
arr[desc--] = 0;
arr[desc--] = 0;
cur--;
}
}
}
};
文章来源:https://blog.csdn.net/nanmiao666/article/details/135279472
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!