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

相关文章
相关标签/搜索