快乐数

力扣题目链接(opens new window)

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。

如果 n 是快乐数就返回 True ;不是,则返回 False 。

示例:

输入:19
输出:true
解释:
1^2 + 9^2 = 82
8^2 + 2^2 = 68
6^2 + 8^2 = 100
1^2 + 0^2 + 0^2 = 1

初见思路

题意不难理解

步骤大致可以拆分成:

1、获取输入整数各位上的数

2、做平方后相加

3、重复上述过程

显然需要有一个循环计算的过程,那么结束条件是sum为1,但要是出现无限循环(sum一直不为1)的情况,那程序就卡死了

如何处理上述情况?

思路

本题的两个关键点:取各个数位上的单个数、循环结束条件

取各个数位上的单个数

先再次复习一下编程中的两种除法操作:取整和取余(取模)

在c++中,

"/"是做取整数的除法,例如:19/10 = 1.9 = 1

"%"是做取除法但是取余数的值,例如:19%10 = 1余9 = 9

那么,可以先用10来和输入整数做取余运算来不断获取整数的个位数,然后通过取整运算将已经获取的数去除

如此循环到只剩下一位数,其再做除法得小数,经过取整后得0,此时循环结束

void getEechNum(int n) {
int curNum;
cout << "从个位开始的每个数为:" << endl;
while (n) {//同时,以n作为循环结束条件
curNum = n % 10;//获取当前个位上的数
cout << curNum << endl;
n /= 10;//去除已获取到的数
}
} int main() {
getEechNum(156);
}

题中要求取到整数的每个单个数后做平方运算,因此用来取每个数的函数可以写成:

// 取数值各个位上的单数之和
int getSum(int n) {
int sum = 0;
while (n) {
sum += (n % 10) * (n % 10);//直接在这里做平方运算
n /= 10;
}
return sum;
}
循环结束条件

通过题目可知,“快乐数”的计算过程可能会出现无限循环的情况

例如,输入整数A,经过10次计算后sum = A

这就进入无限循环了,那么整数A也就不可能是快乐数

上述现象可以作为判断快乐数时循环结束的条件

具体处理上,我们可以让每次计算得到的sum保存到unordered_set中,一旦出现重复值(涉及判断重复值的,直接联想哈希表),即可作出判断。

代码

class Solution {
public:
int getSum(int n){
int sum = 0;
while(n){
sum += (n % 10) * (n % 10);
n /= 10;
}
return sum;
}
bool isHappy(int n) {
//定义一个unordered_set
unordered_set<int> set;
//4、循环计算过程,知道找出快乐数或者陷入死循环
while(1){
//1、获取输入整数每各数位上的数的平方和
int sum = getSum(n);
//2、判断和是否为1
if (sum == 1) {
return true;
}else if(set.find(sum) != set.end()){//如果sum值在set中出现过,则陷入循环
return false;
}else{
set.insert(sum);
}
//3、不为1则更新n值继续计算
n = sum; //重复对sum进行上述运算
} }
};

【LeetCode哈希表#3】快乐数(set)的更多相关文章

  1. leetcode.哈希表.594最长和谐子序列-Java

    1. 具体题目: 和谐数组是指一个数组里元素的最大值和最小值之间的差别正好是1.现在,给定一个整数数组,你需要在所有可能的子序列中找到最长的和谐子序列的长度. 示例 1: 输入: [1,3,2,2,5 ...

  2. LeetCode 哈希表 380. 常数时间插入、删除和获取随机元素(设计数据结构 List HashMap底层 时间复杂度)

    比起之前那些问计数哈希表的题目,这道题好像更接近哈希表的底层机制. java中hashmap的实现是通过List<Node>,即链表的list,如果链表过长则换为红黑树,如果容量不足(装填 ...

  3. LeetCode哈希表

    1. Two Sum https://leetcode.com/problems/two-sum/description/ 不使用额外空间需要n*n的复杂度 class Solution { publ ...

  4. leetcode.哈希表.128最长连续序列-Java

    1. 具体题目 给定一个未排序的整数数组,找出最长连续序列的长度.要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2] 输出: 4 解释: 最长连续序列是 ...

  5. Map - leetcode [哈希表]

    149. Max Points on a Line unordered_map<float, int> hash 记录的是斜率对应的点数 unordered_map<float, i ...

  6. 14 BasicHashTable基本哈希表类(一)——Live555源码阅读(一)基本组件类

    这是Live555源码阅读的第一部分,包括了时间类,延时队列类,处理程序描述类,哈希表类这四个大类. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/oloroso ...

  7. Java数据结构和算法 - 哈希表

    Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...

  8. leetcode 刷题(数组篇)1题 两数之和(哈希表)

    题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标. 你可以假设每种输入只会对应一个答案.但是,数组中同一个元 ...

  9. C#版(打败97.89%的提交) - Leetcode 202. 快乐数 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...

  10. C#LeetCode刷题-哈希表

    哈希表篇 # 题名 刷题 通过率 难度 1 两数之和 C#LeetCode刷题之#1-两数之和(Two Sum) 42.8% 简单 3 无重复字符的最长子串   24.2% 中等 18 四数之和   ...

随机推荐

  1. [转帖]将 Cloudflare 连接到互联网的代理——Pingora 的构建方式

    https://zhuanlan.zhihu.com/p/575228941 简介 今天,我们很高兴有机会在此介绍 Pingora,这是我们使用 Rust 在内部构建的新 HTTP 代理,它每天处理超 ...

  2. echarts给每个柱状图配置不同的颜色

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  3. &&运算提高代码质量

    sendGiveWeb: { code: 200, success: true, data: [ { id: "1230", name: "lh" }, { i ...

  4. svn把文件日期设置为最后提交的时间

    在使用svn进行checkout或update时,我想让文件的日期为提交那时的日期,这要怎样做? 说明:我是在windows下使用TortoiseSVN进行操作的 方法1.修改config [misc ...

  5. 小结_第一个Java程序

    总结: 1. Java程序的编写与执行: 步骤1: 编写. 在后缀名为.java的文件中编写Java代码,该文件称为源文件 步骤2: 编译. 针对后缀名为.java源文件进行编译,生成字节码文件. 格 ...

  6. 【DC渗透系列DC-4】

    主机发现 arp-scan -l ┌──(root㉿kali)-[~] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:6b: ...

  7. 打开PDB报错ORA-30013

    多租户架构,之前还在做运维的时期接触也不多.遇到多租户问题,第一反应是有些发虚的. 但实际很多问题很简单,也容易解决.本文就是一个例子. 问题:RAC节点2打开所有PDB时,报错ORA-30013. ...

  8. 尴尬:在Excel中为指定数据插入饼图失败

    本来是非常非常简单的一个需求,即便不会,随便百度下也都有说明. 可自己却在一次紧急工作中因此耽误了时间,需求是需要插入一个饼图但因操作错误一直无法正确显示饼图数据,非常尴尬,干脆记录下这一刻. 尴尬1 ...

  9. 开源.NetCore通用工具库Xmtool使用连载 - OSS文件上传篇

    [Github源码] <上一篇> 介绍了Xmtool工具库中的图像处理类库,今天我们继续为大家介绍其中的OSS文件上传类库. 将本地文件上传到服务器是软件系统经常会遇到的需求,例如:设置用 ...

  10. ABC 305

    题目列表 前三题过水,第四题分类讨论两个端点之间的距离和所在位置是清醒或睡眠 即可. E 题意:一张图上有一些结点有保安,每个保安有不同的警戒度 \(h_i\),定义 一个结点是安全的 为这个结点可以 ...