快樂數問題

問題描述:設計一個算法,判斷一個數字是不是「快樂數」。快樂數的定義以下:一個正整數,計算出它各位數字的平方和,獲得一個新的數字,再對這個新的數字重複這一過程,直到最後獲得數字1或是其餘某幾個數字的無限循環。在這些數字中,通過上述流程最終能獲得數字1的數字,被稱爲「快樂數」。java

分析:整個算法的設計分爲兩步算法

                     第一步:求數下一個平方計算後的數。app

                     第二步:判斷數值是不是快樂數。優化

         解法一:分兩步進行,第一步計算下一個數,第二步作判斷,能夠利用一個容器保存計算過的數,只要出現1就直接返回是,若是出現重複的非1的數,就直接返回不是,其餘狀況繼續。設計

import java.util.HashSet;
public class Solution {
    
    public boolean isHappy(int n) {
        
        int temp = n;
        HashSet<Integer> hashSet = new HashSet<Integer>(); 
        hashSet.add(temp);
        while (true) {
            temp = getNext(temp);
            if (temp == 1) {
                return true;
            } else if (hashSet.contains(temp)) {
                return false;
            }
            hashSet.add(temp);
        }
    }
    
    private int getNext(int num) {
        int result = 0;
        while (num > 0) {
            result += (num % 10) * (num % 10);
            num = num / 10;
        }
        return result;
    }
}

  解法二:在解法一的基礎上進行優化,根據快樂數的性質,若是一個數「不快樂」,則它計算到後面必然陷入到這個循環裏:4, 16, 37, 58, 89, 145, 42, 20, 4,blog

對於一個大於243的數字來講,它的下一個數字必定比它小。這是由於一個大於1000的數字,它的下一個數字必定比它小,而對於1000如下最大的數字999,它的下一個數字是243,因此1000如下數字的下一個數字也只可能小於或等於243get

基於這兩個特徵,咱們能夠設計出下面這個計算效率更高的算法:hash

public class Solution {
    
    /**
     * 快樂數的判斷
     */
    public boolean isHappy(int n) {
        
        int temp = n;
        while (true) {
            temp = getNext(temp);
            if (temp > 243) {
                continue;
            } else if (temp == 4 || temp == 16 || temp == 37 || temp == 58 ||
                temp == 89 || temp == 145 || temp == 42 || temp == 20) {
                return false;
            } else if (temp == 1) {
                return true;
            }
        }
    }
    
    /**
     * 獲取下一個快樂的數
     */
    private int getNext(int num) {
        int result = 0;
        while (num > 0) {
            result += (num % 10) * (num % 10);
            num = num / 10;
        }
        return result;
    }
}
相關文章
相關標籤/搜索