搜寻吉祥数,在给定的范围内,例如1~99999,找出吉祥数字,满足的条件为:全部数字必须由6或者8构成,如66666,66668,668,…

2023-10-30

题目:在给定的范围内,例如1~99999,找出吉祥数字,满足的条件为:全部数字必须由6或者8构成,如66666,66668,668,…

1.一开始想的很杂,考虑了效率:把要查找的数转化成String再转化成char数组,逐个跟“6”,“8”比较。但是这样的话,用String会创建许多对象,会消耗许多内存资源。

2.想到了将每个需要判断的位数都转化成各位上的数,然后%10,得到这个值跟6和8比较。并且做了一些细节上的优化:

将变量都声明在for循环外边,减少系统在运行期间创建对象的个数,节约系统资源。

3.像这种特定的需求,例如本文的吉祥数,可以考虑采用二叉树的形式进行编码,效率极高(未给出具体代码)。

代码如下:

 

public class JiXiangSearch {
    public static void main(String[] args) {
        //下边两个是主要思路的测试代码,有需要的可以解除注释简单测试一下。
        /*System.out.println(448%10);
         System.out.println((448/10)%10);*/
        
        //正式部分开始,首先声明一些需要用到的变量,降低系统资源消耗
        int n = 0;          //用来接收要查找的数调用toString方法后的长度值
        int temp=0;         //用来接收—10的幂值
        int result=0;       //用来接收i/temp后i的值
        for(Integer i=1;i<=99999;i++) {
            //用字符串长度的形式来表示i是几位数
            n = i.toString().length();  
            //这个for循环的目的是为了逐位的判断i的每个位数上的值是不是6或者8
            for (int j = 0; j <=n-1; j++) {
                //用来复制i的值,保证i的值在计算过程中不直接参与,不发生变化。
                int copy = i;
                //Math类的一个方法求一个数的幂,返回值是double类型,需要强制类型转换
                temp  = (int)(Math.pow(10, j));
                //每次进入循环除以10的幂次方,将要比较的位数转换成个位数。
               result = (copy/temp)%10;
               if(result==6||result==8){        //吉祥数判断,判断当前个位上的数是不是吉祥数字。
                   //判断到最后一位,依然成立,输出i的值,
                   if(j==n-1) {
                       System.out.print(i + " ,");
                   }
               }else{
                   break ;
               }
            }
        }
    }
}

测试结果如下所示:

"C:\Program Files\Java\jdk1.8.0_144\bin\java"
6 ,8 ,66 ,68 ,86 ,88 ,666 ,668 ,686 ,688 ,866 ,868 ,886 ,888 ,6666 ,6668 ,6686 ,6688 ,6866 ,6868 ,6886 ,6888 ,8666 ,8668 ,8686 ,8688 ,8866 ,8868 ,8886 ,8888 ,66666 ,66668 ,66686 ,66688 ,66866 ,66868 ,66886 ,66888 ,68666 ,68668 ,68686 ,68688 ,68866 ,68868 ,68886 ,68888 ,86666 ,86668 ,86686 ,86688 ,86866 ,86868 ,86886 ,86888 ,88666 ,88668 ,88686 ,88688 ,88866 ,88868 ,88886 ,88888 ,

Process finished with exit code 0

写到这里的时候我思考了一个问题,如何才能在比较更少的情况下查询出所有要查找的数字,

例如:如果将内层循环从最高位开始比较,这样如果最高位不符合要求,会减少很多不必要进行的判断,尝试修改代码如下:

  我用九位数测试了一下,结果发现从最高位往最低位走的话,比上面的方式时间还要长,这里有些疑问,不知道为什么?

思路二:只查询6666-8888之间的数,去做一下试验:

 

//正式部分开始,首先声明一些需要用到的变量,降低系统资源消耗
int n = 0;          //用来接收要查找的数调用toString方法后的长度值
int temp = 0;         //用来接收—10的幂值
int result = 0;       //用来接收i/temp后i的值
String[] str = {"1","11","111","1111","11111","111111","1111111","11111111","111111111"};
for(Integer i=1;i<=999999999;i++) {
    //用字符串长度的形式来表示i是几位数
    n = i.toString().length();
    int toInt = Integer.parseInt(str[n-1]);
    if(i>=6*toInt&&i<=8*toInt){
        //这个for循环的目的是为了逐位的判断i的每个位数上的值是不是6或者8
        for (int j = n-1; j >=0; j--) {
            //用来复制i的值,保证i的值在计算过程中不直接参与,不发生变化。
            int copy = i;
            //Math类的一个方法求一个数的幂,返回值是double类型,需要强制类型转换
            temp  = (int)(Math.pow(10, j));
            //每次进入循环除以10的幂次方,将要比较的位数转换成个位数。
            result = (copy/temp)%10;
            if(result==6||result==8){        //吉祥数判断,判断当前个位上的数是不是吉祥数字。
                //判断到最后一位,依然成立,输出i的值,
                if(j==0) {
                    System.out.print(i + " ,");
                }
            }else{
                break ;
            }
        }
    }else{
        continue;
    }
}

结果显示在没有进行判断之前,九位数需要进行133336ms,优化以后需要87610ms,节省了1/3的时间。

请各位大佬路过时候指点一下文章中红色字体,我不是太懂!!!谢谢。

做完这道题有了一些感想,算法的极致大概就是只让计算机查找或者计算工程师们想要查找的东西吧,除此之外的数据

由工程师负责全部排除掉。节约时间,提高效率。        ——我认为算法非常有意思!

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

搜寻吉祥数,在给定的范围内,例如1~99999,找出吉祥数字,满足的条件为:全部数字必须由6或者8构成,如66666,66668,668,… 的相关文章

随机推荐

  • Java中\t的作用

    t是补全当前字符串长度到8的整数倍 最少1个最多8个空格 补多少要看你 t前字符串长度 比如当前字符串长度10 那么 t后长度是16 也就是补6个空格 如果当前字符串长度12 此时 t后长度是16 补4个空格
  • 19 个 K8S 日常故障处理集锦

    问题1 K8S集群服务访问失败 原因分析 证书不能被识别 其原因为 自定义证书 过期等 解决方法 更新证书即可 问题2 K8S集群服务访问失败 curl 7 Failed connect to 10 103 22 158 3000 Conn
  • 【Metashape精品教程15】点云分类 分类地面点 创建DEM

    Metashape精品教程15 点云分类 分类地面点 创建DEM 文章目录 Metashape精品教程15 点云分类 分类地面点 创建DEM 前言 一 点云分类 Classify Points 二 分类地面点 三 手动分类 四 创建DEM
  • 2023网络安全面试题汇总(附答题解析+配套资料)

    随着国家政策的扶持 网络安全行业也越来越为大众所熟知 相应的想要进入到网络安全行业的人也越来越多 为了更好地进行工作 除了学好网络安全知识外 还要应对企业的面试 所以在这里我归总了一些网络安全方面的常见面试题 希望对大家有所帮助 内容来自于
  • 标定协议之CCP协议基础知识介绍

    上一篇 标定协议基础知识介绍 中对标定协议进行了初步的介绍 从这一篇文章开始对CCP标定协议进行相关介绍 本篇将对CCP标定协议相关指令进行介绍 CCP通讯报文定义 CCP标定协议标准中定义了两条CAN通讯报文 CRO Command Re
  • Python 更新pip报错

    解决办法 更新指令中加上 user python m pip install user upgrade pip
  • Tomcat线程模型及调优

    一 Tomcat线程模型 1 BIO 同步阻塞式I O操作 表示Tomcat使用的是传统Java I O操作 即Java io包及其子包 Tomcat7以下版本默认情况下是以bio模式运行的 由于每个请求都要创建一个线程来处理 线程开销较大
  • case when where 显示没有该列 mysql,mysql - MySQL CASE WHEN麻木IS NULL忽略记录WHERE麻木IS NOT NULL - SO中文参考 - www.s...

    计算numb m value NULL 1 7 64 NULL 1 7 65 8070 2 7 935 8070 2 7 941 NULL 3 7 62 8070 4 7 92 8070 4 7 935的每个值的最小值和最大值 取决于COA
  • spring赌上未来的一击:WebFlux性能实测

    最近花了一点时间系统的测试验证了在SpringBoot框架下使用SpringMVC和Spring WebFlux两种框架开发接口 对比了响应时间以及压测吞吐量的区别 WebFlux SpringMVC 如果对WebFlux还不了解的同学 那
  • tesseract64位编译

    经过两天吐血的编译 tesseract终于可以在win64下用了 我这将每一步更加细化 我编译的是tesseract ocr3 02 leptonica1 68 1 要想编译自己的tesseract的lib和dll必须先编译leptonic
  • Linux中通过命令行监控股票报价

    如果你是那些股票投资者或者交易者中的一员 那么监控证券市场将是你的日常工作之一 最有可能的是你会使用一个在线交易平台 这个平台有着一些漂亮的实时图表和全部种类的高级股票分析和交易工具 虽然这种复杂的市场研究工具是任何严肃的证券投资者了解市场
  • 【Vue2.0源码学习】生命周期篇-初始化阶段(initEvents)

    文章目录 1 前言 2 解析事件 3 initEvents函数分析 4 总结 1 前言 本篇文章介绍生命周期初始化阶段所调用的第二个初始化函数 initEvents 从函数名字上来看 这个初始化函数是初始化实例的事件系统 我们知道 在Vue
  • 关于setConnectTimeout和setReadTimeout的问题

    1 问题描述 这几天测试重构后的下载框架 发现在下载过程中如果网络中断或网络较差 个别应用的下载就会阻塞卡住 一直卡在 正在下载 xx 2 问题排查和定位 思考 网络差不应该报网络异常的错误或者直接抛timeout异常吗 所以马上去检查Ht
  • 我所不知道的TCP Socket编程(一)-简介+创建套接字

    Socket编程 套接字 Socket 连接起了数字世界 定义 源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字 其用于标识客户端请求的服务器和服务 它是网络通信过程中端点的抽象表示 包含进行网络通信必需的五种信息 连接使用
  • MMU地址映射过程详细

    ARMv6 MMU简述 1 MMU由协处理器CP15控制 2 MMU功能 地址映射 VA gt PA 内存访问权限控制 3 虚拟地址到物理地址的转换过程 Micro TLB gt Main TLB gt Page Table Walk 址映
  • DVWA平台漏洞测试与源码分析(一)SQL注入

    DVWA平台是初学网络安全者了解十大漏洞的有效途径 此平台收集了当前威胁网络安全的最常见的十大漏洞 并且为各位初学者提供了靶场实验环境 我们可以利用此平台进行各种攻击实验 从而丰富自己对于Web安全的认识 这篇文章主要介绍了DVWA平台中的
  • 【Hello mysql】 mysql的内外连接 (重点)

    Mysql专栏 Mysql 本篇博客简介 介绍mysql的内外连接 mysql的内外连接 重点 内连接 显示SMITH的名字和部门名称 外连接 左外连接 右外连接 总结 表的内外连接是mysql中比较常用的内容 也是我们学习mysql的重点
  • Python str函数

    描述 str函数是Python的内置函数 它将参数转换成字符串类型 即人适合阅读的形式 语法 str object 名称 说明 备注 object 待被转换成字符串的参数 可省略的参数 返回值 返回object的字符串形式 使用示例 1 无
  • vue.js 输入框输入值自动过滤特殊字符替换中问标点

  • 搜寻吉祥数,在给定的范围内,例如1~99999,找出吉祥数字,满足的条件为:全部数字必须由6或者8构成,如66666,66668,668,…

    题目 在给定的范围内 例如1 99999 找出吉祥数字 满足的条件为 全部数字必须由6或者8构成 如66666 66668 668 1 一开始想的很杂 考虑了效率 把要查找的数转化成String再转化成char数组 逐个跟 6 8 比较 但