leetcode202 Happy Number

題目要求

clipboard.png

實現一個算法來判斷一個數字是否開心。一個開心數字是指將數字的各個位上的數求平方和,若是這個數字最終可以計算至1,那麼這個數字就是一個開心數字。若是這個數字一直在某個圈中循環,那麼這就不是一個開心數字。題目中也給了19這個例子。git

思路一:hashset

利用set的特性,咱們能夠將已經遍歷過的值存入其中,若是遇到重複的值就跳出循環並判斷重複的值是否爲1。面試

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

思路二:FLoyd Cycle detection

以前有一道題目,是說如何判斷一個鏈表中是否帶環。能夠參考個人這篇博客。這裏的本質其實和找環是同樣的。既然題目中已經告訴咱們這樣的計算必定會進入一個環,那麼咱們只須要判斷這個環的點中是否是隻有1,就能夠知道這個數字是否是開心數字。算法

int digitSquareSum(int n) {
        int sum = 0, tmp;
        while (n!=0) {
            tmp = n % 10;
            sum += tmp * tmp;
            n /= 10;
        }
        return sum;
    }

    boolean isHappy2(int n) {
        int slow, fast;
        slow = fast = n;
        do {
            //慢指針 每次只走一步
            slow = digitSquareSum(slow);
            //快指針 每次走兩步
            fast = digitSquareSum(fast);
            fast = digitSquareSum(fast);
        } while(slow != fast);//兩者相逢時跳出循環
        if (slow == 1) return true;//若是相逢點爲1,則這個數字是一個開心數字
        else return false;
    }

clipboard.png
想要了解更多開發技術,面試教程以及互聯網公司內推,歡迎關注個人微信公衆號!將會不按期的發放福利哦~segmentfault

相關文章
相關標籤/搜索