LeetCode 202 Happy Number(开心数)(vector、unordered_set)

简介: 版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50541011 翻译写一个算法来决定一个数是否是“开心”的。
版权声明:转载请联系本人,感谢配合!本站地址:http://blog.csdn.net/nomasp https://blog.csdn.net/NoMasp/article/details/50541011

翻译

写一个算法来决定一个数是否是“开心”的。

开心数是被如下步骤所定义的数:

从所有正整数开始,用其每个数字的平方和来替代这个数,不断重复这个过程直到最后的结果为1(此时它就停止了),

或者它在一个不包含1的周期内无限循环。

这些在这个过程中以1结尾的数就是开心数。

例如:19是开心数。

12+92=82
82+22=68
62+82=100
12+02+02=1

原文

Write an algorithm to determine if a number is "happy".

A happy number is a number defined by the following process: 

Starting with any positive integer, replace the number by the sum of the squares of its digits, 

and repeat the process until the number equals 1 (where it will stay), 

or it loops endlessly in a cycle which does not include 1. 

Those numbers for which this process ends in 1 are happy numbers.
Example: 19 is a happy number

12+92=82
82+22=68
62+82=100
12+02+02=1

分析

我原以为这道题难点只是在于把那些那些数字包含的数都找出来,也就是说给出19找出1和9,后来发现还有一个难点……

int getSum(int num) {
    vector<int> digits;
    while (num > 9) {
        digits.push_back(num % 10);
        num = num / 10;
    }
    digits.push_back(num);                 
    int sum = 0;
    for (int i = 0; i < digits.size(); i++) {
        sum += digits[i] * digits[i];
    }       
    return sum;
}

这里用vector来保存了每个数字,然后将其求平方和。下面是一个递归,多嵌套了一层,难度其实也不大,然而提交之后发现还是错了。

bool isHappy(int n) {
    if (n == 1) return true;
    else return isHappy(getSum(n));
    return false;
}

反馈的结果是说2不能通过,试了试:

2,4,16,27,58……最后又是4,16成了死循环了

喔喔,题意中确实提到了:

或者它在一个不包含1的周期内无限循环

想了好久没有想到什么办法能够找出死循环的判断方法,于是只能去找规律了。发现对于:

2,4,8,3,6,9,5

都会造成死循环,于是干脆加上一个判断条件,n等于这些数字时直接返回false。果然通过了……

代码

class Solution {
public:
    int getSum(int num) {
        vector<int> digits;
        while (num > 9) {
            digits.push_back(num % 10);
            num = num / 10;
        }
        digits.push_back(num);
        int sum = 0;
        for (int i = 0; i < digits.size(); i++) {
            sum += digits[i] * digits[i];
        }
        return sum;
    }

    bool isHappy(int n) {
        if (n == 1) return true;
        else if (n != 7 && (2 <= n && n <= 9)) return false;
        else return isHappy(getSum(n));
        return false;
    }
};

进阶

不过我对这种解法还不太满意,因为虽然可以找规律,但毕竟要花蛮多的时间。去学习学习别人的解法吧……

bool isHappy(int n) {
    unordered_set<int> visited;
    while (n != 1) {
        if (visited.find(n) != visited.end())
            return false;   
        visited.insert(n);
        int sum = 0;
        while (n) {
            sum += ((n % 10)*(n % 10));
            n /= 10;
        }
        n = sum;
    }
    return true;
}

这个解法就是完美解决了死循环的问题,用unordered_set的find函数可以很快判断一个数字是否已经访问过了,如果是的话肯定直接false了。

后面的while循环部分则和我的大同小异了 。

目录
相关文章
|
算法
Leetcode 313. Super Ugly Number
题目翻译成中文是『超级丑数』,啥叫丑数?丑数就是素因子只有2,3,5的数,7 14 21不是丑数,因为他们都有7这个素数。 这里的超级丑数只是对丑数的一个扩展,超级丑数的素因子不再仅限于2 3 5,而是由题目给定一个素数数组。与朴素丑数算法相比,只是将素因子变了而已,解法还是和朴素丑数一致的。
98 1
|
5月前
|
存储 SQL 算法
LeetCode 题目 65:有效数字(Valid Number)【python】
LeetCode 题目 65:有效数字(Valid Number)【python】
|
6月前
|
存储 算法
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
【LeetCode力扣】单调栈解决Next Greater Number(下一个更大值)问题
43 0
|
存储
Leetcode Single Number II (面试题推荐)
给你一个整数数组,每个元素出现了三次,但只有一个元素出现了一次,让你找出这个数,要求线性的时间复杂度,不使用额外空间。
39 0
|
存储 C语言 C++
Leetcode17. 电话号码的字母组合:递归树深度遍历(C++vector和string的小练习)
Leetcode17. 电话号码的字母组合:递归树深度遍历(C++vector和string的小练习)
LeetCode contest 190 5417. 定长子串中元音的最大数目 Maximum Number of Vowels in a Substring of Given Length
LeetCode contest 190 5417. 定长子串中元音的最大数目 Maximum Number of Vowels in a Substring of Given Length
LeetCode Contest 178-1365. 有多少小于当前数字的数字 How Many Numbers Are Smaller Than the Current Number
LeetCode Contest 178-1365. 有多少小于当前数字的数字 How Many Numbers Are Smaller Than the Current Number
LeetCode 136. 只出现一次的数字 Single Number
LeetCode 136. 只出现一次的数字 Single Number
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
106 2