当前位置: 首页 > news >正文

刷题笔记:力扣第202题-快乐数

1.本题刚开始没有思路,后来发现题目中说如果不是快乐数,那么就会陷入循环,本质上还是在考察哈希表。完整代码如下:

1. typedef struct{ 2. int key; 3. UT_hash_handle hh; 4. } HashEntry; 5. 6. // 计算数字每位平方和 7. int getSum(int num){ 8. int sum = 0; 9. // 拆分每一位数字 10. while (num){ 11. // 取出个位 12. int tmp = num % 10; 13. // 累加平方值 14. sum += tmp * tmp; 15. // 去掉个位 16. num /= 10; 17. } 18. 19. return sum; 20. } 21. 22. bool isHappy(int n) { 23. // 初始化空哈希表,存储出现过的平方和 24. HashEntry* hashTable = NULL; 25. while (1){ 26. // 更新n为各位平方和 27. n = getSum(n); 28. // 平方和等于1,是快乐数,直接返回true 29. if (n == 1) return true; 30. 31. HashEntry* entry; 32. // 在哈希表查找当前平方和 33. HASH_FIND_INT(hashTable, &n, entry); 34. if (entry == NULL){ 35. // 未出现过,新建哈希节点存入哈希表 36. entry = (HashEntry*)malloc(sizeof(HashEntry)); 37. entry->key = n; 38. HASH_ADD_INT(hashTable, key, entry); 39. } else { 40. // 当前值重复出现,进入循环,不是快乐数 41. return false; 42. } 43. } 44. 45. return false; 46. }

该算法时间复杂度和空间复杂度均为O(logn)(求每位数平方和所需要的时间为logn)。

2.本题的另一种解法是快慢双指针,即弗洛伊德判圈算法,类似于力扣第142题-环形链表Ⅱ。快指针每次计算两次(即计算两次每位数的平方和),慢指针每次计算一次。如果是快乐数,那么快指针会先到达1;如果不是快乐数,则快慢指针会进入循环,因为快指针只相对于慢指针多计算了一次,所以快慢指针最终一定会相遇。完整代码如下:

1. // 计算一个数字每一位的平方和 2. int getSum(int num){ 3. int sum = 0; 4. // 循环拆分数字每一位 5. while (num){ 6. // 取出个位数字 7. int tmp = num % 10; 8. // 累加当前位平方 9. sum += tmp * tmp; 10. // 去掉个位,数字缩小十倍 11. num /= 10; 12. } 13. 14. return sum; 15. } 16. 17. bool isHappy(int n) { 18. // 快慢指针初始化:slow走1次平方和,fast直接走2次平方和 19. int fast = getSum(getSum(n)), slow = getSum(n); 20. // 快指针不等于1说明还未找到快乐数终点 21. while (fast != 1){ 22. // 快指针一次两步 23. fast = getSum(fast); 24. fast = getSum(fast); 25. // 慢指针一次一步 26. slow = getSum(slow); 27. 28. // 快慢指针相遇,说明出现循环,不是快乐数 29. if (fast == slow){ 30. return false; 31. } 32. } 33. // 快指针走到1,是快乐数 34. return true; 35. }

该算法时间复杂度为O(logn),空间复杂度为O(1)。

http://www.jsqmd.com/news/1296722/

相关文章:

  • Evil:iOSmacOS平台的终极Swift光学字符识别解决方案
  • AI配音重音标注实战指南(附ISO/ITU标准对照表+可落地标注模板)
  • GHelper终极指南:轻量化华硕笔记本控制神器,3分钟告别Armoury Crate臃肿体验
  • 2026天津激光切管机行业数据公布,本地优质厂家选型攻略 - 优企甄选
  • 企业加密软件哪个最好用?8 款公认好用的企业加密软件推荐,2026 最新排行榜
  • 机器学习基础与三大范式实战指南
  • 院线赛道竞争白热化,花多芙凭系统化问题肌管理方案,助力美业门店突破经营瓶颈 - 优企甄选
  • 钉钉项目管理系统深度解析:功能、收费与价值
  • php-blurhash性能优化指南:减少计算复杂度的5个实用技巧
  • 一文掌握Fermion远程调试:连接Frida Server实现跨设备动态分析
  • Beyond Compare激活工具终极指南:免费开源密钥生成器完整教程
  • 扣子错误处理节点失效?90%的团队都忽略了这7个关键配置细节!
  • AI如何提升科研论文写作效率:Paperxie实战解析
  • Marshal操作符详解:<|符号如何简化数据提取代码
  • ChatGPT自动化处理工作琐事的实践指南
  • Spring Boot核心特性详解(精品)
  • 碧蓝幻想Relink伤害统计终极指南:免费DPS分析工具完整使用教程
  • Synthetic Data SDK与LLM集成指南:提升文本合成数据质量的技巧
  • OBS Studio终极指南:从零开始掌握免费直播录制软件
  • dotnet-monitor与Grafana集成:打造专业.NET应用监控仪表盘
  • basic-ftp高级技巧:断点续传与传输进度监控实现方法
  • RESAR 性能工程实战(一):一小时、四台 ECS,搭起一个完整的性能实验场
  • 大语言模型编程实战:从入门到工程化应用
  • StereoVision常见问题解决:提升3D重建质量的实用FAQ
  • 如何用Audacium消除背景噪音:专业降噪技巧分享
  • Koodo Reader完整备份恢复指南:保护你的数字阅读资产
  • 5GHz WiFi 丢包困扰了我两周
  • 从 Tool Calling 到 MCP:电商客服 Agent 中业务工具标准化接入的思考
  • BioGDP生物医学绘图平台:科研论文配图的全套解决方案
  • RabbitMQ事件总线实战:NetCoreMicroservicesSample消息通信核心组件