leetcode 202. Happy Number

1.题目

Write an algorithm to determine if a number is "happy".

写一个算法,确定一个数字是否是快乐数字,有关快乐数字的定义可以参考百度百科 快乐数字  

2.算法

我们从百度百科上发现,不是快乐数的数称为不快乐数(unhappy number),所有不快乐数的数位平方和计算,最後都会进入 4 → 16 → 37 → 58 → 89 → 145 → 42 → 20 → 4 的循环中。题目中要求是确定是快乐数字就返回true,不是就返回false,所以我们用hashset放平方后的数的和,如果出现循环就不是快乐数

    public boolean isHappy(int n) {
        // Write your code here
    if (n <= 0)
	{
		return false;
	}
	HashSet<Integer> hs = new HashSet<>();
	hs.add(n);
	while (n != 1)
	{
		int sum = calcu(n);
		if (hs.contains(sum))
		{
			return false;
		}
		hs.add(sum);
		n = sum;
	}
	return true;
}
private int calcu(int n) {
	// TODO Auto-generated method stub
	int sum = 0;
	while (n != 0)
	{
		sum += Math.pow(n % 10, 2);
		n /= 10;
	}
	return sum;
}

,其实我们可以这样做来减小空间复杂度,我们用一个快慢指针,如果循环,快慢指针就会在某一个地方相等

    public boolean isHappy(int n) {
        // Write your code here
    if (n <= 0)
	{
		return false;
	}
	int slow, fast;
	slow = fast = n;
	do {
	    slow = calcu(slow);
	    fast = calcu(fast);
	    fast = calcu(fast);
	    if (fast == 1)
	    {
	        return true;
	    }
	} while (fast != slow);
	return false;
}
private int calcu(int n) {
	// TODO Auto-generated method stub
	int sum = 0;
	while (n != 0)
	{
		sum += Math.pow(n % 10, 2);
		n /= 10;
	}
	return sum;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值