第202题:快乐数

解题思路

202. 快乐数 参考了官方题解
根据题目可知最终只有二种结果:在某个值后无限循环或者收敛到1。这样就可以

  1. 哈希表:用哈希表把每次结果都存入,如果碰到相同的数就说明开始循环了;或者检测到要存入的值是1时,就说明它是快乐数,因为已经收敛到1了。
  2. 快慢指针:
    如果 n 是一个快乐数,即没有循环,那么快指针最终会比慢指针先到达数字 1。
    如果 n 不是一个快乐的数字,那么最终快指针和慢指针将在同一个数字上相遇。

代码

方法一:哈希表
class Solution {
    //方法一:哈希表  :根据题目可知最终只有二种结果:在某个值后无限循环或者收敛到1
	public static boolean isHappy(int n) {
		Set<Integer> set = new HashSet<>();
		while(n!=1 && !set.contains(n)) {  //不是最终的二种情况就一直循环
			set.add(n);
			n=getNext(n);
		}
		return n==1;
    }
	
	public static int getNext(int n) {
		int sum = 0;
		int temp = 0;
		while(n>0) {
			temp = n%10; 
			n/=10;
			sum +=temp*temp;
		}
		return sum;
	}
}

image.png

方法二:快慢指针
class Solution {

	//方法二:快慢指针  
	//如果 n 是一个快乐数,即没有循环,那么快跑者最终会比慢跑者先到达数字 1。
	//如果 n 不是一个快乐的数字,那么最终快跑者和慢跑者将在同一个数字上相遇。
	public static boolean isHappy(int n) {
        //注意二个指针的初始值不能都为n,不然后面while条件就直接不成立,就直接成false了
		int slow=n,fast = getNext(n);   
		while(fast!=1 && fast!=slow) {
			slow = getNext(slow);
			fast = getNext(getNext(fast));
		}
		return fast == 1;
	}
    public static int getNext(int n) {
		int sum = 0;
		int temp = 0;
		while(n>0) {
			temp = n%10; 
			n/=10;
			sum +=temp*temp;
		}
		return sum;
	}
	
}

image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值