实现一个算法来判断一个数字是否开心。一个开心数字是指将数字的各个位上的数求平方和,若是这个数字最终可以计算至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