Leetcode Happy Number

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

A happy number is a number defined by the following process: Starting with any positive integer, replace the number by the sum of the squares of its digits, and repeat the process until the number equals 1 (where it will stay), or it loops endlessly in a cycle which does not include 1. Those numbers for which this process ends in 1 are happy numbers.

Example: 19 is a happy number

  • 12 + 92 = 82
  • 82 + 22 = 68
  • 62 + 82 = 100
  • 12 + 02 + 02 = 1

解题思路:

这道题定义了一种快乐数,就是说对于某一个正整数,如果对其各个位上的数字分别平方,然后再加起来得到一个新的数字,再进行同样的操作,如果最终结果变成了1,则说明是快乐数,如果一直循环但不是1的话,就不是快乐数,那么现在任意给我们一个正整数,让我们判断这个数是不是快乐数,题目中给的例子19是快乐数,那么我们来看一个不是快乐数的情况,比如数字11有如下的计算过程:

1^2 + 1^2 = 2
2^2 = 4
4^2 = 16
1^2 + 6^2 = 37
3^2 + 7^2 = 58
5^2 + 8^2 = 89
8^2 + 9^2 = 145
1^2 + 4^2 + 5^2 = 42
4^2 + 2^2 = 20
2^2 + 0^2 = 4

我们发现在算到最后时数字4又出现了,那么之后的数字又都会重复之前的顺序,这个循环中不包含1,那么数字11不是一个快乐数,发现了规律后就要考虑怎么用代码来实现,我们可以用哈希表来记录所有出现过的数字,然后每出现一个新数字,在哈希表中查找看是否存在,若不存在则加入表中,若存在则跳出循环,并且判断此数是否为1,若为1返回true,不为1返回false。


 Java code:

第一种:

public boolean isHappy(int n) {
        // the key to solve this problem is to determine where to stop loop
        if(n<=0) { return false; }
        if(n == 1){ return true; }
        
        HashSet<Integer> result = new HashSet<Integer>();
        //n > 1
        while(n!=1) {
            result.add(n);
            int sum = 0;
            while(n>0) {
                sum += (n%10) * (n%10);
                n = n/10;
            }
            if(sum == 1) {
                return true; 
            }
            if(result.contains(sum)) {
                break;
            }
            n = sum;
        }
        return false;
    }

第二种:(参考他人的,更为简洁明了)

 public boolean isHappy(int n) {
        HashSet<Integer> happy = new HashSet<Integer>();
        int sum = 0;
        while(!happy.contains(n)){
            sum =0;
            happy.add(n);
            int tmp = 0;
            while(n > 0){
                tmp = n % 10;
                n = n / 10;
                sum += tmp*tmp;
            }
            if(sum == 1){
                return true;
            } 
            n = sum;
        }
        return false;
    }

Reference:

1. http://www.cnblogs.com/grandyang/p/4447233.html

2. https://sisijava.wordpress.com/2015/05/26/leetcode-happy-number/

 

posted @ 2015-09-10 07:20  茜茜的技术空间  阅读(167)  评论(0编辑  收藏  举报