zoukankan      html  css  js  c++  java
  • [LeetCode] 202. 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

    • 1^2 + 9^2 = 82
    • 8^2 + 2^2 = 68
    • 6^2 + 8^2 = 100
    • 1^2 + 0^2 + 0^2 = 1

    Credits:
    Special thanks to @mithmatt and @ts for adding this problem and creating all test cases.

    写一个算法判断一个数是不是快乐数。快乐数:一个正整数,如果对其各个位上的数字分别平方求和得到一个新的数,再进行同样的操作,如果结果变成了1,则说明是快乐数。

    解法:循环求平方和,即求出当前数组的平方和后,再以此平方和作为新的数继续求平方和,而循环终止条件是:得到的平方和为1,或得到的平方和在之前的循环中出现过,那以后会一直循环,不可能达到1。判断平方和是否为1很简单,每次检查就好了;而判断平方和是否出现过,则只需要维持一个Set,每次循环检查当前平方和是否在Set中,在则终止循环,不在则将此平方和放到Set中。

    Java:

    public class Solution {
        public boolean isHappy(int n) {
            Set<Integer> got = new HashSet<>();
            while (n != 1 && !got.contains(n)) {
                got.add(n);
                int sum = 0;
                while (n != 0) {
                    sum += Math.pow(n % 10, 2);
                    n /= 10;
                }
                n = sum;
            }
            return n == 1;
        }
    }
    

    Python:

    class Solution:
        # @param {integer} n
        # @return {boolean}
        def isHappy(self, n):
            lookup = {}
            while n != 1 and n not in lookup:
                lookup[n] = True
                n = self.nextNumber(n)
            return n == 1
    
        def nextNumber(self, n):
            new = 0
            for char in str(n):
                new += int(char)**2
            return new  

    Python:

    class Solution(object):
        def isHappy(self, n):
            """
            :type n: int
            :rtype: bool
            """
            got = set()
            while n != 1 and n not in got:
                got.add(n)
                sum = 0
                while n:
                    sum += (n % 10)**2
                    n //= 10
                n = sum
    
            return n == 1
    

    C++:

    class Solution {
    public:
        bool isHappy(int n) {
            set<int> got;
            while (n != 1 && got.find(n) == got.end()) {
                got.insert(n);
                int sum = 0;
                while (n) {
                    sum += pow(n % 10, 2);
                    n /= 10;
                }
                n = sum;
            }
            return n == 1;
        }
    };
    

      

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    字符串匹配——KMP算法(C++)
    数论——Fibonacci数列(C++)
    数据结构——线段树之二(C++)
    数据结构——线段树之一(C++)
    最后的最后
    开始的开始
    10.25模拟 保留道路
    10.25模拟 列车调度
    10.25模拟 三角形
    洛谷 P1093 奖学金
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8564438.html
Copyright © 2011-2022 走看看