【哈希-简单】202. 快乐数

这篇博客介绍了如何判断一个数是否为快乐数,提供了两种不同的Python实现方法:一种通过记录历史数字列表,另一种利用数学特性。快乐数是经过数字平方和的迭代最终达到1的数。文章还给出了示例和代码执行效率。

【题目】
编写一个算法来判断一个数 n 是不是快乐数。
「快乐数」定义为:
对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果 可以变为 1,那么这个数就是快乐数。
如果 n 是快乐数就返回 true ;不是,则返回 false 。
【示例 1】
输入:19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1
【示例 2】
输入:n = 2
输出:false
【提示】
1 <= n <= 231 - 1
【代码】
【Python】
【方法1:】
jilu列表中记录的是所有出现过的数字,每次处理完一个数字生成下一个数字之后,就会判断这个新产生的数字,是否存在于jilu之中,若存在于,则说明构成一个死循环,该数不是快乐数。

class Solution:
    def isHappy(self, n: int) -> bool:
        cnt=n
        jilu=[n]
        while cnt!=1:
            cnt=str(cnt)
            s=0
            for c in cnt:
                s+=(ord(c)-48)**2
            cnt=s
            if cnt in jilu:
                return False
            jilu.append(cnt)
        return True

【方法2:数学法】跟方法1的代码逻辑很像,但是不同在于,cycle_members是导致不能构成快乐数的数字链的集合(列表),每处理完一个数,产生一个新的数,都要判断该数是否存在于循环列表中,如果存在返回False
执行用时:
36 ms, 在所有 Python3 提交中击败了95.01%的用户
内存消耗:
14.6 MB, 在所有 Python3 提交中击败了82.40%的用户

class Solution:
    def isHappy(self, n: int) -> bool:
        cycle_members = {4, 16, 37, 58, 89, 145, 42, 20}

        def get_next(number):
            total_sum = 0
            while number > 0:
                number, digit = divmod(number, 10)
                total_sum += digit ** 2
            return total_sum

        while n != 1 and n not in cycle_members:
            n = get_next(n)

        return n == 1

【知识点】
divmod(num,10)

n=13
shiwei,gewei=divmod(n,10)
print(shiwei,gewei)
### LeetCode 哈希题目及解法 #### 1. 使用哈希表解决交集问题 对于两个组 `nums1` 和 `nums2` 的交集问题,可以通过构建一个简单哈希表来高效解决问题。具体实现如下: ```cpp class Solution { public: vector<int> intersect(vector<int>& nums1, vector<int>& nums2) { vector<int> res; int hash[1005] = { 0 }; for (int i = 0; i < nums1.size(); i++) hash[nums1[i]]++; for (int i = 0; i < nums2.size(); i++) { if (hash[nums2[i]]) { res.push_back(nums2[i]); hash[nums2[i]]--; } } return res; } }; ``` 这种方法利用了一维组作为哈希表记录第一个组中各元素出现的次,在遍历第二个组时检查这些元素是否存在于哈希表中并相应减少计值[^2]。 #### 2. 判断快乐 快乐是指不断替换该为其各个位置上的字的平方和最终能得到1的情况;否则进入循环无法得到1即不是快乐。此过程可以用集合(Set)存储已经遇到过的中间结果以检测是否存在环形路径: ```javascript var isHappy = function(n) { let sums = new Set(); let sum = 0; let arr = String(n); while(true){ for(let i = 0;i<arr.length;i++){ sum += arr[i]*arr[i]; } if(sum===1)return true; if(sums.has(sum))return false; else{ sums.add(sum); arr = String(sum); sum = 0; } } }; ``` 这段代码展示了如何使用 JavaScript 中的 `Set` 据结构来跟踪之前计算的结果从而避免陷入无限循环[^3]。 #### 3. 设计高效的哈希 当涉及到实际应用中的哈希算法设计时,有两个主要方面需要注意:一是将键转换成适合散列的据形式,二是处理可能发生的冲突情况。通常情况下会对分桶量取模(`%`)来进行映射,并采用诸如拉链法或开放地址法这样的策略应对潜在冲突[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值