1.快乐数
编写一个算法来判断一个数是不是“快乐数”。
一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无限循环但始终变不到 1。如果可以变为 1,那么这个数就是快乐数。
思路:使用快慢指针破循环。“快指针”每次走两步,“慢指针”每次走一步,当二者相等时,即为一个循环周期。此时,判断是不是因为1引起的循环,是的话就是快乐数,否则不是快乐数。
class Solution {
public:
int CalSum(int n)
{
int sum = 0;
while(n>0)
{
int bit = n % 10; //得到每一位,平方和并相加
sum += bit * bit;
n = n / 10;
}
return sum;
}
bool isHappy(int n) {
int slow = n;
int fast = n;
do
{
slow = CalSum(slow); //慢指针走一步 快指针走两步
fast = CalSum(fast);
fast = CalSum(fast);
}while(slow != fast);
return slow == 1; //如果最后为1是循环终止条件,那么说明是快乐数
}
};
2.移除链表元素
删除链表中等于给定值 val 的所有节点。
思路:如果删除节点在中间很好解决,但是如果删除节点在头部,这个我们需要借助“哨兵节点”进行解决。就是在定义一个节点作为整个链表的头节点。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeElements(ListNode* head, int val) {
ListNode* temp = new ListNode(0);
temp->next = head;
ListNode* pre = temp;
ListNode* del = NULL;
while(pre->next != NULL)
{
if(pre->next->val == val)
{
del = pre->next; //将删除节点接下来 后续删除
pre->next=pre->next->next; //前继节点指向下下个节点
}
else
{
pre = pre->next;
}
if(del != NULL)
{
delete del;
del = NULL;
}
}
return temp->next;
}
};
参考:https://leetcode-cn.com/problems/remove-linked-list-elements/submissions/