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/

  • 相关阅读:
    MIne FirstBlog
    P6563 [SBCOI2020]一直在你身旁
    P6563 [SBCOI2020]一直在你身旁
    T122085 [SBCOI2020]时光的流逝
    LC 918. Maximum Sum Circular Subarray
    1026 Table Tennis
    LC 1442. Count Triplets That Can Form Two Arrays of Equal XOR
    LC 1316. Distinct Echo Substrings
    LC 493. Reverse Pairs
    1029 Median (二分)
  • 原文地址:https://www.cnblogs.com/anne-vista/p/4796694.html
Copyright © 2011-2022 走看看