Java算法01

题目描述:

  1. 不可能出现无限循环的情况,也就是说必定会进入环;
  2. 我们需要判断的只有,进入环的时候是1还是其他位置?

题目解析:

  1. 我们定义快慢指针,快指针走两步,慢指针走一步。
  2. 由于取每一位的平方和相加的步骤经常要用到,我们把它封装到方法里。

示例代码:

//快乐数

class Solution {
    public static int bitSum(int n) {
        int sum=0;
        while(n !=0) {

            sum+=(n%10)*(n%10);
            n/=10;
        }
        return sum;
    }
    public boolean isHappy(int n) {
        int show=n;
        int fast=bitSum(n);

        while(show!=fast) {
            show=bitSum(show);
            fast=bitSum(bitSum(fast));
        }
        return show==1?true:false;
    }
}

为什么是快指针走两步,慢指针走一步?

其实这就好比操场跑步,如果你和另一个人都是相同速度,那么就永远也不可能相遇

为什么最开始时快指针比慢指针多走一步?

第一次判断时,slow 和 fast 是一样的,直接跳出循环,导致判断错误!

先看这个代码

再看这个代码

为啥fast指针每次要走两步?能不能是三步?

步伐差距越大,越容易错过环内的相遇点

数学角度(为什么两步刚好)
  • 假设你有一个循环,快指针每次走两步,慢指针每次走一步。

  • 这时,快指针会追上慢指针,最终在环内相遇。

  • 如果快指针每次走三步,它可能会跳过某些位置,从而无法在合理时间内相遇。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值