codecamp

哈希表 快乐数

题目

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

解法一:利用哈希表特性

1.判断是否存在

class Solution {
public boolean isHappy(int n) {
        Set<Integer> set = new HashSet<>();
        set.add(n);
        while (true){
            n = create(n);
            if(n == 1)
                return true;
            if(set.contains(n))
                return false;
            set.add(n);
        }
    }


    private int create(int n) {
        int sum = 0;
        while (n != 0){
            sum += n % 10 * (n % 10);
            n /= 10;
        }
        return sum;
    }
}

2.判断是否为1.否则继续做循环,重复出现则跳出循环

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> happySet = new HashSet();
        return judge(n, 0, happySet) == 1;
    }
    public int judge(int n, int happy, Set<Integer> happySet) {
        while(n >= 10) {
            int x = n % 10;
            n = n / 10;
            happy += x*x;
        }
        happy += n*n;   //这个happy是经过平方和后的新数
        if(!happySet.add(happy)) {
            return happy;
        }
        return happy == 1 ? happy : judge(happy, 0, happySet);
    }
}

3.快慢指针

public boolean isHappy2(int n){
        int slow = n, fast = create(n);
        while(fast != 1){
            if(fast == slow) return false; // 快指针等于慢指针,这个说明在计算过程中循环了,数字之间构成了环。
            fast = create(create(fast));
            slow = create(slow);
        }
        return true;
    }


    private int create(int n) {
        int sum = 0;
        while (n != 0){
            sum += n % 10 * (n % 10);
            n /= 10;
        }
        return sum;
    }

python

class Solution:
    def isHappy(self, n: int) -> bool:
        happy_set = set()
        flag = self.judge(n, 0, happy_set)
        return flag == 1 
    def judge(self, n: int, happy: int, happy_set: set) -> int:
        while(n >= 10):
            x = n % 10
            happy += x*x
            n = n // 10
        happy += n*n    #这个happy是经过平方和后新的新数
        if(not(happy in happy_set)):
            happy_set.add(happy)
        else:
            return happy
        return happy if happy == 1 else self.judge(happy, 0, happy_set)

4.关键点

HashSet(Collection<? extends E> c) 构造一个包含指定集合中的元素的新集合。

HashSet(int initialCapacity) 构造一个新的空集合;

背景HashMap实例具有指定的初始容量和默认负载因子(0.75)。

HashSet(int initialCapacity, float loadFactor) 构造一个新的空集合; 背景HashMap实例具有指定的初始容量和指定的负载因子。

哈希表 分糖果
字符串处理 最长公共前缀
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

趣味题

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }