實現一個算法來判斷一個數字是否開心。一個開心數字是指將數字的各個位上的數求平方和,若是這個數字最終可以計算至1,那麼這個數字就是一個開心數字。若是這個數字一直在某個圈中循環,那麼這就不是一個開心數字。題目中也給了19這個例子。git
利用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; }
以前有一道題目,是說如何判斷一個鏈表中是否帶環。能夠參考個人這篇博客。這裏的本質其實和找環是同樣的。既然題目中已經告訴咱們這樣的計算必定會進入一個環,那麼咱們只須要判斷這個環的點中是否是隻有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; }
想要了解更多開發技術,面試教程以及互聯網公司內推,歡迎關注個人微信公衆號!將會不按期的發放福利哦~segmentfault