【算法】使用数位算法生成0至某个数之间的整数(for循环之外的另一种实现方式,蛮长见识的)

news2024/10/5 16:19:16

导入:
对某个整数进行遍历,按常规的编程思维都是
for(int i=0;i<=number;i++){}
但是如果这个数比较大,大到无法的话,可能使用普通for循环方式进行遍历就有些吃力了。
那么针对这个问题,可以考虑深度搜索算法dfs来辅助完成。
对于要遍历的这个数来说,不要当成是一个数,要当成一个由多个单数组成的字符串。
这样的话就将数的遍历,变成了对数串的每一位进行遍历。

  1. 可以考虑将这个数拆分成一个数组

如 134512=>[2,1,5,4,3,1]
321=>[1,2,3]
即 数最高位在数组中依然是最高位(索引值最大,且为数位-1)

用java实现可以参考这个写法:

num%10 取num的个位
num/=10 去除num的个位(减少一位)

public static int raw[]=null;// 数值拆分后单个数值
public static void Handle(int num){
		raw=new int[(num+"").length()];
		for(int i=0;i<raw.length;i++){
			raw[i]=num%10;
			num/=10;
		}
	}
  1. 使用dfs算法递归输出数据
    若要输出[0-235]区间内所有整数,可以参考下列这个图来进行理解。
  1. 整个数可以分成3位,那么第一个数就是000,第二个数就是001 ===》最高位为0,1,2可以选择。当第一位选择0和1时,后面的几位都不做限制可以选择0-9任意数。而当第一位为2时,那么第二位的值便不能是0-9了。比如当第二位取4时,那么第三位取0也得到240,比235还大。
  2. 因此可以定义一个变量为当前取值位置p,第一次是p为最高位,在数组中的索引位置为长度-1,即数组的最后一位。这里不理解可以参考321=>[1,2,3]
  3. 还得再定义一个变量就是当前位置取值是否已经达到临界点。
    如最高位取值为0时,后续两位可以取到000-099
    最高位取1时,后续两位可以取到100-199
    最高位取2时,后续两位就不能取到200-299了。这时就需要告诉下一位,即第二位,取值时不能超过自身原本的上限值3. 若超过,那么就超过原本的数值范围,无意义了。那么定义一个布尔类型的变量limit就很有必要了。
    4.当定义位置小于0时,证明已经遍历完这个数了就不再进行深度递归了。

在这里插入图片描述
具体的java代码实现参考

public static int num[]=null;//每次递归产生的一个数
	public static void dfs(int p,boolean limit){
		if(p<0){
			for(int i=raw.length-1;i>=0;i--){
				System.out.print(num[i]);
			}
			System.out.println();
			return;
		}
		int up=limit?raw[p]:9;//如果上一位是限制位,那么当前位最大值是对应的那位的值 否则当前位最大值为9
		for(int i=0;i<=up;i++){
			num[p]=i;
			dfs(p-1, limit&&i==up); //limit&&i==up 如果当前i已经是最大的那个值,证明已经到达限制位了 如 2 3 5 的最高位为2 那么 0 1 不是限制位 2就到达临界点,就到限制位了
		}
	}

可以借助这个图来进行代码理解
在这里插入图片描述

例如 215 生成过程

  1. 先dfs(p=2,limit=true)=> 产生for(int i=0;i<=2;i++){}循环 当i=1时,dfs(p=1,limit=false)
    i=2时 此时b[2]=2
  2. dfs(p=1,limit=true) =>此时的上限值为3 产生for(int i=0;i<=3;i++){}循环 i=1是 b[1]=1;
  3. 再继续dfs[p=0,limit=false] =>此时的上限值为9 产生for(int i=0;i<=9;i++){} i=5时 b[0]=5;
  4. 因此df递归三次形成了一个数组b
    b[2]=2,b[1]=1,b[0]=3 ===》调换顺序输出结果为213

完整的示例如下:

public class Test {
	//深度搜索
	public static int raw[]=null;// 数值拆分后单个数值
	public static int num[]=null;//每次递归产生的一个数
	public static void dfs(int p,boolean limit){
		if(p<0){
			for(int i=raw.length-1;i>=0;i--){
				System.out.print(num[i]);
			}
			System.out.println();
			return;
		}
		int up=limit?raw[p]:9;//如果上一位是限制位,那么当前位最大值是对应的那位的值 否则当前位最大值为9
		//注意理解这个循环  第一次循环 其产生的是最高位   第一次循环中每次循环都递归调用了 且p变成了p-1 也即是dfs这个函数会紧接着生成第二位 然后是第三位
		for(int i=0;i<=up;i++){
			num[p]=i;
			dfs(p-1, limit&&i==up);
		}
	}
	public static void Handle(int number){
		raw=new int[(number+"").length()];
		num=new int[(number+"").length()];
		for(int i=0;i<raw.length;i++){
			raw[i]=number%10;
			number/=10;
		}
		dfs(raw.length-1, true); //第一层就是有限制的
	}
	public static void main(String[] args) {
		//数位搜索算法
		int num=123;
		Handle(num);
	}

在这里插入图片描述

在这里插入图片描述
说明

  1. 这个案例只是演示了数位算法生成一个范围数的过程,其效率因为输出语句等原因,并没有使用普通for循环那么来得快,具体如何使用。还需要各位看官进一步深究。
  2. 本案例通过数位算法,来提供了一种遍历某个范围数的过程。而不是简单逐个相加
  3. 此案例经测试,如果不加输出语句的话,其执行效率还是蛮ok的。有兴趣的可以测一测不加输出语句时,这个算法和for循环哪个的速度更快一些。

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

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

相关文章

Linux--ServerProgramming--(1)TCP\IP协议族

1.TCP/IP 协议族 1.1 TCP/IP协议族及主要协议 TCP/IP 协议族是一个四层协议系统。自上而下为&#xff08;如下图所示&#xff09;&#xff1a;应用层传输层网络层数据链路层 应用层负责处理应用程序逻辑&#xff0c;在用户空间实现。&#xff08;少数服务器程序在内核中实现。…

快速上手kettle(一)壶之简介

Linux核心命令系列文章目录 快速上手kettle&#xff08;一&#xff09;&#xff1a;壶之简介 快速上手kettle&#xff08;二&#xff09;&#xff1a;Kettle初体验&#xff08;博主正在玩命更新中&#xff09; 快速上手kettle&#xff08;三&#xff09;&#xff1a;Kettle转换…

艾迪普发布新一代国产化“3D引擎+工具+平台”,加速释放数字内容生产力

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 艾迪普的2023新产品发布会在5月20日在北京隆重举行&#xff0c;该发布会以"向新出发 智见未来"为主题&#xff0c;艾迪普重磅推出了新一代实时三维图形图像引擎IDP Engine 4.0、iVis无代码编程数字孪生应用开发工…

谷歌云开启GPU算力狂飙,驱动AIGC时代加速到来

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 随着人工智能的飞速发展&#xff0c;尤其是大型AI模型、AIGC的崛起&#xff0c;对AI算力产生了巨大的需求。以GPU为核心的算力供给&#xff0c;已经成为大模型、AIGC乃至整个智能产业发展的关键基础设施。因此&#xff0c;对…

springboot+vue基于java的用户行为的个性化新闻推荐系统

使用个性化新闻服务平台相对传统个性化新闻服务方式具备很多优点&#xff1a;首先可以大幅提高个性化新闻服务信息检索&#xff0c;只需输入新闻相关信息就能在数秒内反馈想要的结果&#xff1b;其次可存储大量的个性化新闻服务信息&#xff0c;同时个性化新闻服务安全性有更高…

Java内存模型 JMM

并发编程模型的两个关键问题 线程之间如何通信及线程之间如何同步。 线程之间如何通信&#xff1a;共享内存&#xff0c;消息传递线程之间如何同步通信是指线程之间以何种机制来 交换信息同步是指程序中用于控制不同线程间 操作发生相对顺序 的机制在共享内存的并发模型里&a…

案例21:Java农产品供求信息系统设计与实现开题报告

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

腾讯、头条 | 算法岗详细面经

作者 | 常青czq 整理 | NewBeeNLP 面试锦囊之面经分享系列&#xff0c;持续更新中 赶紧后台回复"面试"加入讨论组交流吧 写在前面 本硕华南某985&#xff0c;有过两段实习经历&#xff0c;一段是大厂的算法实习&#xff0c;另一段是招行Fintech实习&#xff0c;虽然…

如何在Linux桌面上创建快捷方式?

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 一般而言&#xff0c;Linux环境下在命令行上通过软件包管理工具安装软件&#xff0c;或者从网站直接下载已经编译好的二进制软件包&#xff0c;软件安装好之后不会在桌面上创建快捷方式。接下来如果想要在桌…

iOS推送播放语音播报更新

接上篇如何让iOS推送播放语音&#xff0c;之前的结论是iOS如果需要送审商店只能播放本地的mp3文件&#xff0c;这里更新一下&#xff1a; 更新 语音的播放&#xff0c;最终调用的方法是UNNotificationSound(named: xxx)&#xff0c;而这个方法官方文档注释如下&#xff1a; // …

chatgpt赋能python:Python写Kafka:介绍及优势

Python写Kafka&#xff1a;介绍及优势 Kafka是目前互联网企业使用最广泛的消息队列系统之一&#xff0c;广泛应用于应用程序之间的异步通信、数据采集、日志收集等领域。Python作为一门通用且易学易用的编程语言&#xff0c;在和Kafka结合时也展现出了其独特的优势。本文将介绍…

我C,最好用的AI工具居然是它!

这几天写了两篇自己的AI实践&#xff1a; 《程序员&#xff0c;如何借力ChatGPT&#xff1f;》&#xff1b; 《普通人&#xff0c;如何借力ChatGPT&#xff1f;》&#xff1b; 很多朋友在后台留言&#xff0c;问我用的是哪一款AI工具。 先说结论。 我最终在ChatGPT&#xff0c;…

超大规模数据库集群保稳系列之二:数据库攻防演练建设实践

总第562篇 2023年 第014篇 本文整理自美团技术沙龙第75期的主题分享《美团数据库攻防演练建设实践》&#xff0c;系超大规模数据库集群保稳系列&#xff08;内含4个议题的PPT及视频&#xff09;的第2篇文章。 本文首先介绍了美团当前数据库运维现状、遇到的问题&#xff0c;以及…

Flutter 笔记 | Flutter 可滚动组件

Sliver布局模型 我们介绍过 Flutter 有两种布局模型&#xff1a; 基于 RenderBox 的盒模型布局。基于 Sliver ( RenderSliver ) 按需加载列表布局。 之前我们主要了解了盒模型布局组件&#xff0c;下面学习基于Sliver的布局组件。 通常可滚动组件的子组件可能会非常多、占用…

Protein Cell | 中国农科院基因组所刘永鑫组综述微生物组研究的过去、现在和未来(大众评审截止26号20点)...

微生物组研究展望&#xff1a;过去、现在和未来 Microbiome research outlook: past, present, and future 2023-5-23&#xff0c;Protein & Cell&#xff0c;[IF 15.328] DOI&#xff1a;10.1093/procel/pwad031 原文链接&#xff1a;https://academic.oup.com/proteincel…

adb 命令速查(下)

ADB 关于APP安装、调试和monkey压力测试 作者&#xff1a;炭烤毛蛋 &#xff0c;查看博主了解更多。 提示&#xff1a;承接上篇《adb 命令速查(中)》&#xff0c;本文将 文章目录 ADB 关于APP安装、调试和monkey压力测试7 adb 关于 apk 的相关操作7.1 安装 apk普通安装带有命…

QQGC?揭秘QQ的AI绘画大模型技术

&#x1f449;腾小云导读 2022年来&#xff0c;AIGC概念迅速出圈并快速形成产业生态&#xff0c;成为继PGC、UGC之后新的数字内容创作形式。QQ影像中心提出了自研的AI画画技术方案——QQGC&#xff0c;本文将介绍在QQGC基础大模型训练中的实践和探索&#xff0c;接着往下看吧~ …

我用AI帮我唱了首“基尼太美”,颠覆了我的认知!太牛逼了

目录 前言 AI唱"基尼太美"是什么感觉 使用so-vits-svc打造自己专属歌手 1.声音素材整理 2.训练模型 3.让AI唱歌​编辑 AI歌手背后的技术 AI歌手会成为主流吗 写到最后 大家好&#xff0c;我是大侠&#xff0c;AI领域的专业博主 前言 在5月份&#xff0c;孙…

第五篇:强化学习基础之马尔科夫决策过程

你好&#xff0c;我是zhenguo(郭震) 今天总结强化学习第五篇&#xff1a;马尔科夫决策过程 基础 马尔科夫决策过程&#xff08;MDP&#xff09;是强化学习的基础之一。下面统一称为&#xff1a;MDP MDP提供了描述序贯决策问题的数学框架。 它将决策问题建模为&#xff1a; 状态…

司空见惯 - 使用dBm表示功率的各种现实情况

前面一篇文章介绍过&#xff0c;使用dBm表示功率时&#xff0c;如何转换为mW。 那现实世界的实际情况中&#xff0c;使用dBm来表示电磁波的能量强度&#xff0c;列表如下&#xff1a; Power level Power Notes 526 dBm 3.61049 W 黑洞碰撞后的引力波辐射的功率&#xff0c…