题目:在给定的范围内,例如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或者8for (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或者8for (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的时间。

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

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

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

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

  1. (java)给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. public class LengthOfLongestSubstring {public int lengthOfLonges ...

  2. 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度

    题目 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 &q ...

  3. 2021-12-19:找到所有数组中消失的数字。 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums

    2021-12-19:找到所有数组中消失的数字. 给你一个含 n 个整数的数组 nums ,其中 nums[i] 在区间 [1, n] 内.请你找出所有在 [1, n] 范围内但没有出现在 nums ...

  4. 给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。

    目录 一.代码 二.代码分析 一.代码 public class Demo {public static void main(String[] args) {Scanner sc = new Scan ...

  5. python找色_python实现从一组颜色中找出与给定颜色最接近颜色的方法

    本文实例讲述了python实现从一组颜色中找出与给定颜色最接近颜色的方法.分享给大家供大家参考.具体分析如下: 这段代码非常有用,可以找到指定颜色相似的颜色,比如有一组8个颜色,现在给定一个rgb格式 ...

  6. 找出数组中第k大小的数,输出数所在的位置

    找出数组中第k大小的数,输出数所在的位置 /*写一段程序,找出数组中第k大小的数,输出数所在的位置.例如{2,4,3,4,7}中,第一大的数是7,位置在4. 第二大.第三大的数都是4,位置在1.3随便 ...

  7. Java 找出1000以内所有的完数

    package studing; public class wanshu {     // 一个数恰好等于它的因子之和,此数称为完数,如:6=1+2+3     //编程找出1000以内所有的完数   ...

  8. 使用Cheat Enginee(CE)找出“雷数”、“笑脸”和“计时器”

    使用Cheat Enginee(CE)找出"雷数"."笑脸"和"计时器" 找出"雷数"的内存地址: 一.在ce中输入雷数 ...

  9. python实现从一组颜色中找出与给定颜色最接近颜色的方法

    本文实例讲述了python实现从一组颜色中找出与给定颜色最接近颜色的方法.分享给大家供大家参考.具体分析如下: 这段代码非常有用,可以找到指定颜色相似的颜色,比如有一组8个颜色,现在给定一个rgb格式 ...

最新文章

  1. Intro to Parallel Programming CUDA-第二单元
  2. JDK源码解析-Collection.iterator方法
  3. 外部中断器1C语言程序,单片机C语言代码:外部中断,按下中断按键LED不亮,LED1正常亮...
  4. Linux中read接收用户输入
  5. Nginx常见配置:负载均衡、限流、缓存、黑名单和灰度发布
  6. 账户的配置使您无法使用该计算机,2个方法解决“user profile service服务未能登录无法加载用户配置文件”...
  7. Office Communications Server 和客户端使用的端口和协议
  8. 软件项目管理原则谈-转自51testing
  9. Julia:last() 和first()
  10. 18.10.29 POJ 3987 Computer Virus on Planet Pandora(AC自动机+字符串处理)
  11. 那些值得一读再读的好书
  12. 全程BUG跟踪管理, 云效平台助企业提升项目研发进度
  13. ins的更新带来的一系列问题
  14. 【Android】图像像素点理解
  15. 关于Json解析(org.json.JSONObject)
  16. 《How powerful are graph neural networks》论文翻译
  17. python爬虫爬取彼岸图网图片
  18. Docker入门指南
  19. osm地图服务器搭建(二)
  20. 金山网络-度过生死线

热门文章

  1. java猜拳程序_java用循环方式实现和计算机玩猜拳的程序
  2. 《老码说编程之玩转Swift江湖》一书终于出版了
  3. 利用Python实现微信定时为指定的人发送消息(新手)
  4. 哭唧唧!半年内使用过蚂蚁借呗、京东白条的 一律不给贷款?
  5. 从0到1简易区块链开发手册V0.5-实现余额查询
  6. echarts 饼状图制作 legend 在右边且带有自定义参数,title在图标中间!
  7. 微型计算机原理实验心得,微机原理实验心得体会
  8. 【工业大数据】大数据驱动的智能车间运行分析与决策方法体系
  9. 浅谈NAND FLASH的两种编程方式
  10. 权威发布 鸿蒙涅槃,《鸿蒙涅槃》曾圣雕塑首场发布会在河北美院成功举办