問題描述:設計一個算法,判斷一個數字是不是「快樂數」。快樂數的定義以下:一個正整數,計算出它各位數字的平方和,獲得一個新的數字,再對這個新的數字重複這一過程,直到最後獲得數字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; } }