快乐数 ---- 双指针

本文介绍了如何利用快慢指针技巧判断一个整数是否为快乐数,通过计算每位数的平方和并追踪是否存在环来确定。算法首先定义`bitSum`函数求和,然后在`isHappy`函数中使用循环和条件判断来确定快乐数特征。
摘要由CSDN通过智能技术生成

题目链接

题目:

分析:

  • 第一种情况: 是快乐数: 示例1
  • 第二种情况: 不是快乐数, 死循环: 示例2
  • 第三种情况: 没有死循环  不存在这种情况, 因为n最大是2^31 -1 , 这个数是一个十位数, 我们假设每一位都是最大数9, 那么这个数没一位的平方和为810, 也就是说, 比9999999999小的所有数, 他们每一位的平方和都小于这个数, 所以最多计算811次, 那么一定会找到两个相同的数, 就一定存在循环
  • 那么第一种情况和第二种情况, 我们可以总结成一种情况, 那就是存在环的情况, 需要用到快慢指针, (与判断链表是否存在环方法一样), 那么只需判断这个环的值是不是1, 如果是1, 则是快乐数, 如果不是1, 则不是快乐数

思路:

  1. 写出每一位数平方和的方法bitSum
  2. 定义两个变量, 一个slow  = n, 一个fast = bitSum(n)
  3. 循环判断如果slow和fast不相等, 则slow向后移, 即slow = bitSum(slow), fast向后移两个, 即fast = bitSum(bitSum(fast)
  4. 相等时, 判断这个数slow或fast 是不是1

代码:

class Solution {
    public int bitSum(int n){
        int sum = 0;
        while(n != 0){
            int t = n%10;
            sum += t*t;
            n = n/10;
        }
        return sum;
    }
    public boolean isHappy(int n) {
        int slow = n;
        int fast = bitSum(n);
        while(slow != fast){
            slow = bitSum(slow);
            fast = bitSum(bitSum(fast));
        }
        return slow == 1;


    }
}

 

 

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值