【Lintcode】488. Happy Number

题目地址:

https://www.lintcode.com/problem/happy-number/description

给定一个正整数 n n ,求其各位数之平方和,得出新数,再不停对这个新数做同样操作。如果最终得到了 1 1 ,则返回true,其余情况则返回false。

法1:用哈希表记录算出来的数,如果有重复则返回false。如果中途得到了 1 1 则返回true。代码如下:

import java.util.HashSet;
import java.util.Set;

public class Solution {
    /**
     * @param n: An integer
     * @return: true if this is a happy number or false
     */
    public boolean isHappy(int n) {
        // write your code here
        Set<Integer> set = new HashSet<>();
        set.add(n);
        int i = 0;
        while ((i = sum(n)) != 1) {
            if (!set.add(i)) {
                return false;
            }
            n = i;
        }
        
        return true;
    }
    
    private int sum(int n) {
        int res = 0;
        while (n > 0) {
            int i = n % 10;
            res += i * i;
            n /= 10;
        }
        
        return res;
    }
}

法2:用链表求环的办法,快慢指针。

public class Solution {
    public boolean isHappy(int n) {
        // write your code here
        int slow = n, fast = n;
        do {
            slow = sum(slow);
            fast = sum(sum(fast));
            if (fast == 1) {
                return true;
            }
        } while (slow != fast);
        
        return false;
    }
    
    private int sum(int n) {
        int res = 0;
        while (n > 0) {
            int i = n % 10;
            res += i * i;
            n /= 10;
        }
        
        return res;
    }
}
发布了388 篇原创文章 · 获赞 0 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_46105170/article/details/105355684