哈希表 快樂數(shù)

2020-06-16 11:10 更新

題目

編寫一個(gè)算法來判斷一個(gè)數(shù) n 是不是快樂數(shù)。

「快樂數(shù)」定義為:對(duì)于一個(gè)正整數(shù),每一次將該數(shù)替換為它每個(gè)位置上的數(shù)字的平方和,然后重復(fù)這個(gè)過程直到這個(gè)數(shù)變?yōu)?1,也可能是 無(wú)限循環(huán) 但始終變不到 1。如果 可以變?yōu)? 1,那么這個(gè)數(shù)就是快樂數(shù)。

如果 n 是快樂數(shù)就返回 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.否則繼續(xù)做循環(huán),重復(fù)出現(xiàn)則跳出循環(huán)

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;   //這個(gè)happy是經(jīng)過平方和后的新數(shù)
        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; // 快指針等于慢指針,這個(gè)說明在計(jì)算過程中循環(huán)了,數(shù)字之間構(gòu)成了環(huán)。
            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    #這個(gè)happy是經(jīng)過平方和后新的新數(shù)
        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.關(guān)鍵點(diǎn)

HashSet(Collection<? extends E> c) 構(gòu)造一個(gè)包含指定集合中的元素的新集合。

HashSet(int initialCapacity) 構(gòu)造一個(gè)新的空集合;

背景HashMap實(shí)例具有指定的初始容量和默認(rèn)負(fù)載因子(0.75)。

HashSet(int initialCapacity, float loadFactor) 構(gòu)造一個(gè)新的空集合; 背景HashMap實(shí)例具有指定的初始容量和指定的負(fù)載因子。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)