力扣算法-Day14

第202题. 快乐数

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

「快乐数」 定义为:

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

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。

思路:

递归:终止条件——n = 1的时候返回true,n = 4 的时候返回false。10以内的数字只有4是不断的循环的。
哈希表:

  • 先理解题目要求,这道题的要点一共有两个:
    1. 做完某次计算后等于 1,return true,不必多说。
    2. 在计算的过程中无限循环始终不变为 1,也就是说,它的计算结果 sum 会重复出现,这是本题的关键,若在循环的过程中 sum 重复出现,说明它永远不可能等于 1,return false
  • 理解了以上两点再来看就比较简单了,当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。在本题中,使用数组作为哈希表用来存放每次计算的结果,初始数组都为 0,每次计算后将结果作为下标映射到数组元素。若对应数组元素为 0,说明此结果没得到过,将其改为 1;若为 1,说明计算结果已经重复,return false
  • 那么数组的大小怎么确定呢?题目中告诉了 n 的大小最大不超过 2^31-1,即最大不超过 10 位数,也就是说,计算的结果最大不超过 9^2*10 也就是 810,再稍微大一点就行了,所以是820,这也是为什么本题能用数组的原因,否则只能递归或者手搓set(下一期会出)。
  • 注意,使用数组来做哈希的题目,是因为题目都限制了数值的大小。而且如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间的极大浪费。

双指针:快慢指针

初始化:慢指针、快指针都为 n 。慢指针每次走一步,快指针每次走两步。如果遇到无限循环的数字,这两个指针一定会相遇。这个时候,相遇的时候快慢指针如果指到的数字为1。这个时候循环结束,返回 true(这个时候慢指针走完一轮、快指针一直为1)。否则返回 false。
这里所说的向前走一步是 “对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和”这个意思。

 递归:

bool isHappy(int n) {if (n == 1) {return true;}if (n == 4) {return false;}int sum = 0;while (n>0) {sum += (n % 10)*(n % 10);n /= 10;}return isHappy(sum);
}

哈希表:

int getSum(int n) {int sum = 0;while (n) {sum += (n % 10) * (n % 10);n /= 10;}return sum;
}bool isHappy(int n){int sum = getSum(n);int hash[820] = {0};while (sum != 1) {if (hash[sum] == 1) {return false;} else {hash[sum]++;}sum = getSum(sum);}return true;
}

双指针:

int get_sum(int n) {int sum = 0;while (n) {sum += (n % 10) * (n % 10);n /= 10;}return sum;
}bool isHappy(int n) {int slow = n;int fast = n;do {slow = get_sum(slow);fast = get_sum(get_sum(fast));} while (slow != fast);return (fast == 1);
}

总结:

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。

这一期专栏记录将我每天的刷题,希望各位的监督,也希望和各位共勉。

追光的人,终会光芒万丈!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2660233.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Rocky9 1.28安装kubernetes

1.环境准备 二进制安装比较复杂,但是也比较稳定,适用于线上环境使用。   本笔记参考自:https://github.com/cby-chen/Kubernetes ,针对文中内容,有部分镜像无法拉取等,还有一部分有点小问题,…

2024-软件测试工程师面试题,面试前一天刷效果更佳。

bug的定义,bug的周期 软件bug是指软件程序的漏洞和缺陷,测试工程师或用户所发现和提出的软件可改进的细节、或与需求文档存在差异的功能实现等生命周期中缺陷状态:新建-->指派-->已解决-->待验-->关闭 发现BUG-->提交BUG--&g…

如何本地部署Nextcloud结合cpolar搭建专属私有云盘远程访问(内网穿透)

文章目录 摘要1. 环境搭建2. 测试局域网访问3. 内网穿透3.1 ubuntu本地安装cpolar3.2 创建隧道3.3 测试公网访问 4 配置固定http公网地址4.1 保留一个二级子域名4.1 配置固定二级子域名4.3 测试访问公网固定二级子域名 摘要 Nextcloud,它是ownCloud的一个分支,是一个文件共享服…

高智能氛围感知兼具运动与豪华质感 EMEYA开启百万纯电新时代

在纯电动汽车成为刚需的时代,售价百万的纯电轿车应该拥有怎样的体验? 最近,路特斯推出一款百万纯电四门超跑轿车——EMEYA,这款车11月广州车展亮相并开启预定后,3小时内便订单即破300辆。一款百万级的电动汽车为何受到…

51单片机(STC8)-- GPIO输入输出

文章目录 I/O口相关寄存器端口数据寄存器端口模式配置寄存器(PxM0,PxM1)端口上拉电阻控制寄存器(PxPU)关于I/O的注意事项 配置I/O口I/O设置demoI/O端口模式LED控制(I/O输出)按键检测(I/O输入) S…

openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作示例

文章目录 openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入数据-管理并发写入操作示例175.1 相同表的INSERT和DELETE并发175.2 相同表的并发INSERT175.3 相同表的并发UPDATE175.4 数据导入和查询的并发 openGauss学习笔记-175 openGauss 数据库运维-备份与恢复-导入…

vue3+vite组件中使用Cesium粒子系统

一、注意事项 1.图片的引用路径必须从根目录(即index.html所在的目录)开始,如果使用相对路径,也要返回到根目录再转到对应的目录。 //第一种,直接从根目录开始 image: src/assets/particles/Blowing Snow.png//第二种…

Flink Kafka[输入/输出] Connector

本章重点介绍生产环境中最常用到的Flink kafka connector。使用Flink的同学,一定会很熟悉kafka,它是一个分布式的、分区的、多副本的、 支持高吞吐的、发布订阅消息系统。生产环境环境中也经常会跟kafka进行一些数据的交换,比如利用kafka con…

贝叶斯算法的故事丨机器学习一文解读

今天分享的内容是贝叶斯算法的核心原理与应用,接下来,通过一个小故事让你快速理解贝叶斯。 杰克是一位聪明的探险寻宝家,有一天,他得到了一张藏宝图,上面标记了宝藏可能埋藏的几个地点:一个古老的城堡、一个…

《深入理解C++11:C++11新特性解析与应用》笔记四

第四章 新手易学,老兵易用 4.1 右尖括号>的改进 在 C98 中,有一条需要程序员规避的规则:如果在实例化模板的时候出现了连续的两个右尖括号 >,那么它们之间需要一个空格来进行分隔,以避免发生编译时的错误。C98 会将>&g…

什么是番茄时钟?如何利用番茄时钟提升工作/学习效率?

番茄时钟的由来“传说” ​ 弗朗西斯科西里洛在上大学期间,一度苦于学习效率的低下,一直不能专注于学习,或学习一会就会分心,于是他找了一个定时器,每次学习时他都设定一个时间进行倒计时,如此反复&#x…

25、Qt设备识别(简单的密钥生成器)

一、说明 在很多商业软件中,需要提供一些可以试运行的版本,这样就需要配套密钥机制来控制,纵观大部分的试用版软件,基本上采用以下几种机制来控制。 1、远程联网激活,每次启动都联网查看使用时间等,这种方…

获取b站合集视频时长最新可用代码(2023.12.28)小白也能用

在网上搜索获取b站分集视频时长的代码,发现大部分都过时了 原链接:已过时代码链接 我对原代码做出了部分修改,以下代码于2023.12.28测试(Edge浏览器) javascript: (function() {var hour 0;var minute 0;var secon…

labuladong日常刷题-双指针 | LeetCode 83删除排序链表中的重复元素 5最长回文子串

双指针操作链表与字符串 LeetCode 83 删除排序链表中的重复元素 2023.12.28 题目链接labuladong讲解[链接] ListNode* deleteDuplicates(ListNode* head) {/*暴力求解ListNode* cur new ListNode();ListNode* prenode cur;cur->next head;cur cur->next;while(cu…

从Java 8到Java 17:Spring Boot项目升级的终极指南

Java的世界一直在进步,随着Java 17的发布,众多开发者面临着将他们的Spring Boot应用从Java 8迁移到最新版本的任务。在这篇博客中,我将详细介绍如何平滑、高效地完成这一升级过程。从梳理可能的挑战到实际操作步骤,我将为你的升级…

Vue ThreeJs实现银河系行星运动

预览 可通过右上角调整参数&#xff0c;进行光影练习 代码 <template><div id"body"></div> </template> <script>import * as THREE from three import { OrbitControls } from three/examples/jsm/controls/OrbitControls import …

网络编程『简易TCP网络程序』

&#x1f52d;个人主页&#xff1a; 北 海 &#x1f6dc;所属专栏&#xff1a; Linux学习之旅、神奇的网络世界 &#x1f4bb;操作环境&#xff1a; CentOS 7.6 阿里云远程服务器 文章目录 &#x1f324;️前言&#x1f326;️正文TCP网络程序1.字符串回响1.1.核心功能1.2.程序…

【解决方案】智能语音模块,东胜物联远场语音解决方案让控制更简单,应用于智能家居等场景

现在的天气真是冷得不想多动一下&#xff0c;又想打开取暖器&#xff1f;有了它&#xff0c;用声音就能遥控&#xff0c;今天我们就来聊聊智能语音模块。 技术概述 远场语音技术&#xff0c;采用了麦克风阵列、信号处理技术以及先进的语音识别引擎&#xff0c;使得设备能够在距…

k8s快速搭建

VMware16Pro虚拟机安装教程VMware16.1.2安装及各版本密钥CentOS7.4的安装包:提取码&#xff1a;lp6qVMware搭建Centos7虚拟机教程 搭建完一个镜像 关机 拍摄一个快照,克隆两个作为子节点 0. 环境准备 在开始之前&#xff0c;部署Kubernetes集群机器需要满足以下几个条件&#…

Android集成OpenSSL实现加解密-集成

导入so 将编译生成的 OpenSSL 动态库文件&#xff08;.so 文件&#xff09;复制到你的 Android 项目的 libs 目录中 导入头文件 将编译生成的include文件夹导入到项目中 build.gradle添加配置 defaultConfig {……testInstrumentationRunner "androidx.test.runner…