leetcode-简单题-202. 快乐数

https://leetcode-cn.com/problems/happy-number/

关于是否重复循环的问题,可以用:

  1. 一快一慢指针来判断是否有循环
  2. 用哈希表存储值,判断是否有重复
    但第二种方法有缺陷,如果循环过大时,需要超大的内存。

解题思路:
方法:
使用 “快慢指针” 思想,找出循环:“快指针” 每次走两步,“慢指针” 每次走一步,当二者相等时,即为一个循环周期。此时,判断是不是因为 1 引起的循环,是的话就是快乐数,否则不是快乐数。
注意:此题不建议用集合记录每次的计算结果来判断是否进入循环,因为这个集合可能大到无法存储;另外,也不建议使用递归,同理,如果递归层次较深,会直接导致调用栈崩溃。不要因为这个题目给出的整数是 int 型而投机取巧。

我思故我在
2020-08-13
这个问题用哈希表没有问题。集合不会很大。对于一个数n,它有log10(n)位,所以顶多log10(n)次就会跌落到三位数的范围内,三位数范围循环也顶多占用999个整数空间。log10(n)+999不会很大的。
题解出处:
https://leetcode-cn.com/problems/happy-number/solution/shi-yong-kuai-man-zhi-zhen-si-xiang-zhao-chu-xun-h/

class Solution {
    public boolean isHappy(int n) {
        Set repeatNumber = new HashSet<Integer>();
        int number = 0;
        while(true){
            //计算平方和
            while(n != 0){
                System.out.println("No1.: "+number);
                number += Math.pow(n % 10, 2);//保留最小一位
                n = (int)n / 10;   
                System.out.println("number: "+number);
                System.out.println("n: "+n);
            }
            //判断是否等于1
            if(number == 1) return true;
            //判断是否循环,循环了就不happy,这是数是否在set里,不在就加进去
            if(repeatNumber.contains(number)){
                return false;
            }
            repeatNumber.add(number);
            n = number;//更换n的值进入下一次循环
            number = 0;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值