leetcode题202快乐数,java解答,不断优化到beate100%

2023-11-13

一、问题描述:

快乐数

Category Difficulty Likes Dislikes
algorithms Easy (62.47%) 868 -
Tags

hash-table | math

Companies

airbnb | twitter | uber

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

「快乐数」 定义为:

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

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

示例 1:

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

输入:n = 2
输出:false

提示:

  • 1 <= n <= 231 - 1

Discussion | Solution

二、题解:

麒麒先说明一下,题解1和题解2都没有beat100%,题解3才优化到beat100%

麒麒的思路1:

主要思路是先将取n的字符串形式s,再遍历s,其中使用HashMap类型的变量map的key来保存s的元素,value来保存个数,于是然后再遍历map,将key对应的元素处理,逐个平方相加再乘于value个数就得到新的n值。当n的小于10时,判断n是否等于1,是,则返回true;反之添加到集合set里面,如果set以及存在了,那么就返回false.

前提引入:

  • 先使用一个集合set来保存n小于10的情况,当小于10,如果没有等于1,那么就变成该小于10的值;
  • s字符串类型变量来保存n的字符串形式;
  • 使用HashMap<Character, Integer>类型的map来处理s的每一个元素

分析过程:

处理n<10的过程:
  • 因为每次处理后的n最终一定会小于10,因此在外层循环的结构体里使用一个判断当(n小于10时),如果等于1则返回true,反之,则添加到集合set里面,如果set也添加不了,就说明该n值重复了,题目的n并不是快乐数
处理n>10的过程:
  • 先构造n的字符串形式s,再逐个遍历s的字符c,遍历时,
  • 当字符c不存在于map的key里面,就添加该key,并且相应的value赋值为1;
  • 如果map的key有值,就对应的value加1;
  • 更新n值(先改为0);
  • 遍历该map:for (char c : map.keySet())
    • 定义变量num为n的某一位数:int num = c - '0';
    • 取该位数的个数,用count来记录:int count = map.get(c);
    • map的keySet的每个值的遍历时都要跟新n:n += num * num * count;
    • 每一次都需要清空map,防止原来的值影响。
xin麒的题解1
class Solution {
    public boolean isHappy(int n) {
        HashMap<Character, Integer> map = new HashMap<>();
        HashSet<Integer> set = new HashSet<>();
        while (true) {
            if(n < 10){
                if(n == 1){return true;}
                if(!set.add(n)){
                    return false;
                }
            }
            String s = n + "";
            for (char c : s.toCharArray()) {
                if (map.containsKey(c)) {
                    int i = map.get(c);
                    map.replace(c, i + 1);
                } else {
                    map.put(c, 1);
                }
            }
            n = 0;
            for (char c : map.keySet()) {
                int count = map.get(c);
                int num = c - '0';
                n += num * num * count;
            }
            map.clear();
        }

    }
}
运行:

在这里插入图片描述

优化思路2:

优化思路:寻找出n<10时可以满足最终结果为1的整数(放到idea里面测试啦);然后就可以在题解里改变一下判断条件:在循环迭代过程中使得n<10时,当n为17,便返回true;反之false.(注意,该题比较特殊,因此可以这样优化。)

如下图:

在这里插入图片描述

xin麒的题解3(与上面的对比仅仅提升1ms):
class Solution {
    public boolean isHappy(int n) {
        HashMap<Character, Integer> map = new HashMap<>();
        while (true) {
            if(n < 10){
                if(n == 1 || n == 7){
                    return true;
                }else{
                    return false;
                }
            }
            String s = n + "";
            for (char c : s.toCharArray()) {
                if (map.containsKey(c)) {
                    int i = map.get(c);
                    map.replace(c, i + 1);
                } else {
                    map.put(c, 1);
                }
            }
            int sum = 0;
            for (char c : map.keySet()) {
                int count = map.get(c);
                int num = c - '0';
                sum += num * num * count;
            }
            n = sum;
            map.clear();
        }

    }
}

(但是还是beat9.01%,xin麒哭了)运行:

在这里插入图片描述

xin麒的题解3:

还是换回普通思路比较好,麒麒终于成功了,下面题解的思路分析和xin麒写的这片文章的实际上一样的:
leetcode使用java解题202快乐数,beat100%

还有的是这个还是有些冗余的代码,于是麒麒打算后面找时间优化下。

class Solution {
    public boolean isHappy(int n) {
        HashSet<Integer> set = new HashSet<>();
        while (true) {
            if(n <= 10){
                if(n == 1 || n == 7 || n == 10){
                    return true;
                }else{
                    return false;
                }
            }
            int sum = 0;
            int count = 0;
            while (n >= 10) {
                int ren = n % 10;
                if (ren != 0){
                    count = 1;
                }
                sum += ren * ren;
                n /= 10;
            }
            if (count == 0 && n == 10){return true;}
            sum += n * n;
            n = sum;
        }
    }
}

运行:

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode题202快乐数,java解答,不断优化到beate100% 的相关文章

随机推荐

  • 代码和数据结构

    代码 58同城 给出任意一个正整数 怎么用递归把他反过来打印 include
  • C++ 类 & 对象

    C 在 C 的基础上增加了面向对象编程 OOP 支持面向对象程序设计 类是 C 的核心特性 一种用户自定义的类型 用于指定对象的形式 类包含数据和用于处理数据的方法 函数 数据称为成员变量 函数称为成员函数 类可以看作是一种模板 用来创建具
  • 2022-03-09 Unity 3D两个场景的切换

    文章目录 效果 实现步骤 1 创建场景 2 添加按钮 3 写C 脚本实现切换 4 添加Component到Button上 5 添加两个Scene到Build中 测试效果 参考资料 效果 在scene1中点击按钮 进入scene2 实现步骤
  • Android 高德地图 关于INVALID_USER_KEY和INVALID_USER_SCODE的问题

    本文主要讲我在配置高德地图时候碰到的问题和解决方法 希给遇到同样问题的你一些帮助 1 INVALID USER KEY 当时我的Log上显示此问题 并且显示key为空 但我明明在mete data标签中写了我的key值 后发现manifes
  • 基于Spring Boot AOP用户权限系统模块开发

    公司项目需要涉及到用户权限的问题 每个用户都应该有自己的权限 而且权限应该是灵活可变的 系统的登陆模块因为涉及到分布式部署的问题以及前后端分离 不能采用传统的session作为登陆方式 而是采用JWT的方式实现 保证了接口的无状态性 但是这
  • 初步认识Ehcache清空缓存的3种策略

    Ehcache是一种广泛使用的开源Java分布式缓存 主要面向通用缓存 Java EE和轻量级容器 它具有内存和磁盘存储 缓存加载器 缓存扩展 缓存异常处理程序 一个gzip缓存servlet过滤器 支持REST和SOAP api等特点 在
  • flutter dio HandshakeException: Handshake error in client 解决方法,以及DefaultHttpClientAdapter红线问题。

    是证书问题导致 下面是强制认证 import package dio dio dart import package dio adapter dart 导入这个包 添加DefaultHttpClientAdapter Response re
  • 错误【ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed...】

    Downloading https download pytorch org models resnet50 19c8e357 pth to home luanhaijing cache torch hub checkpoints resn
  • 语音识别之获取语言数据(portaudio的平台搭建)

    我们要进行语言识别 那么就要先构建好平台 portaudio 我们需要采集所需要的16KHZ频率 16比特的声音信号 我们就可以采用portaudio来实现这个功能 那么这个Portaudio怎么使用呢 请看 http www cnblog
  • Java基础十一(private、this关键字和构造函数)

    私有private关键字 成员变量是否一定需要全部向外界访问 如果需要向外界访问 则public 如不需要向外界访问 则private 但是一般而言 都会将成员变量私有化 给成员变量 private是彻底不想给外界类中不需要对外提供的内容都
  • Python中类属性和类方法

    1 类的结构 1 1 术语 实例 使用面相对象开发 第 1 步 是设计 类 使用 类名 创建对象 创建对象 的动作有两步 1 在内存中为对象 分配空间 2 调用初始化方法 init 为 对象初始化 对象创建后 内存 中就有了一个对象的 实实
  • UID卡、CUID卡、FUID卡、UFUID卡的区别及写入方式

    UID卡 国外又称GEN1 所有区块可被重复读写 卡片ID可改写且使用后门指令更改ID 卡片ID可重复修改 相应后门指令 意味着可被使用后门指令检测是否为克隆卡的机器发现 CUID卡 国外又称GEN2 所有区块可被重复读写 卡片ID可改且使
  • align text-align

    align 规定 div 元素中的内容的水平对齐方式 text align 规定 元素中 的文本的水平对齐方式 两个属性使用的地方不一样的 div align center This is some text div align直接写在是d
  • WPF在TreeView的子项中的TextBlock,触发点击事件时,获得当前文本框所在的TreeViewItem数据对象

    要实现的效果是 在一个深层treeview控件的treeviewitem中有个textblock 而我要在点击这个textblock时阻断向下传递 e handle true 并且将当前这个项的绑定属性IsExpanded设置相反值 前台代
  • CSRF漏洞简单解决

    在表单内增加了一个隐藏域 再登陆页面增加 然后扫描软件在扫描就扫描不出来了 如下
  • 光敏电阻的原理及应用

    转载出 http www jqr8 com thread 1406 1 1 html 一 光敏电阻的概念 光敏电阻器 photovaristor 又叫光感电阻 是利用半导体的光电效应制成的一种电阻值随入射光的强弱而改变的电阻器 入射光强 电
  • 第一章 Web前端技术简介 A卷

    一 选择题 在HTML中有效 规范的注释声明是 D A 这是注释 B C D 关于W3C标准 下列说法错误的是 B A W3C标准是由W3C组织制定的一系列Web标准 B htm span p 是符合W3C标准规范的书写方式 C W3C标准
  • python万能存储包pickle

    pickle几乎可以保存python的一切格式对象 字典 列表等等 无需将其转为numpy或pandas等其他格式再保存 缺点是它不像json等是通用格式 只能使用python来读取 pickle官方文档 pickle dump obj f
  • Docker源码修改工作总结(三)

    话不多说上干货 一 安装mysql数据库 并且建立相关表 在本地主机上安装mysql数据库 并且建立一个名为docker的数据库 在数据库中建立两个数据表分别为container auto和container user 分别代表自动生成的秘
  • leetcode题202快乐数,java解答,不断优化到beate100%

    一 问题描述 快乐数 Category Difficulty Likes Dislikes algorithms Easy 62 47 868 Tags hash table math Companies airbnb twitter ub