zoukankan      html  css  js  c++  java
  • 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/

  • 相关阅读:
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    Evanyou Blog 彩带
    线性表——数组实现
    this指针与const成员函数
    类对象拷贝是不是赋值操作??
    你真的理解内联函数吗?
    名字查找先于类型检查:函数重载与作用域
    谈谈函数调用
    推荐形参使用常量引用:void func(const T &);
  • 原文地址:https://www.cnblogs.com/anne-vista/p/4796694.html
Copyright © 2011-2022 走看看