【golang】map遍历注意事项

news2024/12/27 10:43:17

结论

for循环中三个表达式:
for initialization; condition; post { }
初始initialization只会评估一次,后续更新表达式值将不起作用,但post可以实现更新

  • map 循环判断某个元素是否存在时常出现下面问题
for _, ok1 := numsSet[num+1]; ok1; {
	...
	更新num值,但ok1的值不会被更新,死循环
}
---------------------------------------------------------
for _, ok := m[num]; ok; _, ok = m[num] {
	更新num值,ok在for循环第三个表达式中被跟新,可以实现功能
}
-----------------------------------------------------------
for _, ok := m[num]; ok; {
	...
	// 内部手动更新也可以,关键点就是ok这个循环遍历只在第一次遍历的时候创建并评估
	_, ok = m[num]  
}

问题分析

使用for循环遍历判断某个元素是否存在,会存在一定的问题
for _, ok1 := numsSet[num+1]; ok1; {...} 这行代码的问题分析:

错误分析

  • 在 Go 语言中,for 语句的迭代子句可以有以下几种形式:
    • for initialization; condition; post { } // 初始initialization只会评估一次,后续更新表达式值将不起作用,但post可以更新
    • for condition { }
    • for { }

当 you 尝试使用 for _, ok1 := numsSet[num+1]; ok1; {...} 时,存在以下错误:

  • 即使 you 正确接收了这两个值,如 _, ok1 := numsSet[num+1]for 循环的条件部分 ok1 只会在循环开始时被评估一次,而不会在每次迭代后重新评估(因此想着通过函数内部修改num,再评估一次_, ok1 := numsSet[num+1]是不可行的),因此无法实现循环的正确终止条件。

正确写法1:利用for循环第三个表达式,更新第二个判断条件
核心在于:for _, ok := m[num]; ok; _, ok = m[num] {...}

func findContinueNum2(nums []int) int {
	m := map[int]struct{}{}

	for _, val := range nums {
		m[val] = struct{}{}
	}

	res := 1
	for k, _ := range m {
		curRes := 1
		// 每个key验证
		if _, exist := m[k-1]; !exist {
			// 第一个数,统计最长
			num := k + 1
			for _, ok := m[num]; ok; _, ok = m[num] {
				curRes++
				res = max(res, curRes)
				num++
			}
		}
	}
	return res
}

正确写法2

package main

func findContinueNum2(nums []int) int {
    numsSet := map[int]struct{}{}
    for _, val := range nums {
       numsSet[val] = struct{}{}
    }
    res := 1
    for k := range numsSet {
       curRes := 1
       if _, ok := numsSet[k-1];!ok {
          // 第一个数,起点
          num := k
          for {
             _, ok1 := numsSet[num+1]
             if!ok1 {
                break
             }
             curRes++
             res = max(curRes, res)
             num++
          }
       }
    }
    return res
}

func max(a, b int) int {
    if a > b {
       return a
    }
    return b
}

代码解释

  • findContinueNum2 函数中,首先创建了一个 map[int]struct{} 来存储 nums 切片中的元素。
  • 然后遍历 numsSet 中的键。
    • k-1 不在 numsSet 中时,将 k 作为连续序列的起始元素。
    • 接着进入一个无限 for 循环,在每次迭代中,使用 _, ok1 := numsSet[num+1] 来检查 num+1 是否在 numsSet 中。
      • 如果 ok1false,使用 break 终止内部的 for 循环。
      • 否则,更新 curRes 的值并将 num 加 1。
  • max 函数用于比较 curResres 的大小,返回较大的值。

使用示例

func main() {
    nums := []int{1, 2, 3, 5, 6, 7, 9, 10, 11}
    result := findContinueNum2(nums)
    println(result)
}

代码解释

  • main 函数中,定义了一个整数切片 nums
  • 调用 findContinueNum2 函数并将结果存储在 result 中。
  • 最后打印结果。

上述代码通过修正后的 for 循环结构,能够正确处理连续元素的查找和计数,避免了原代码中 for 循环使用不当的问题。

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

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

相关文章

5G CPE接口扩展之轻量型多口千兆路由器小板选型

多口千兆路由器小板选型 方案一: 集成式5口千兆WIFI路由器小板方案二:交换板 + USBwifiUSB WIFI选型一USBwifi选型二:四口千兆选型一四口千兆选型二:四口千兆选型三:部分5G CPE主板不支持Wifi,并且网口数量较少,可采用堆叠方式进行网口和wifi功能 扩展,本文推荐一些路由…

PromptGIP:Unifying lmage Processing as Visual Prompting Question Answering

“Unifying Image Processing as Visual Prompting Question Answering” 文章提出了一种名为 PromptGIP 的通用模型,将图像处理任务统一为视觉提示问答范式,在多个图像处理任务上展现出良好性能,为通用图像处理提供了新的思路和方法。 confe…

【MySQL】索引 面试题

文章目录 适合创建索引的情况创建索引的注意事项MySQL中不适合创建索引的情况索引失效的常见情况 索引定义与作用 索引是帮助MySQL高效获取数据的有序数据结构,通过维护特定查找算法的数据结构(如B树),以某种方式引用数据&#xf…

Doxygen 使用指南

Doxygen 是一个文档生成工具,可以从源代码中的注释生成高质量的文档,支持多种编程语言(如 C/C、Python、Java 等)。以下是 Doxygen 的基本使用方法。 1. 安装 Doxygen 1.1 下载 Doxygen 访问 Doxygen 官网。根据操作系统选择合适…

Jensen-Shannon Divergence:定义、性质与应用

一、定义 Jensen-Shannon Divergence(JS散度)是一种衡量两个概率分布之间差异的方法,它是Kullback-Leibler Divergence(KL散度)的一种对称形式。JS散度在信息论、机器学习和统计学等领域中具有广泛的应用。 给定两个概…

一个特别的串口通讯

背景 设备是EPICS流式细胞仪,这个设备的控制系统是在DOS系统上的。数据存储在硬盘上,不带串口通讯功能。我们遇到了这个设备后,就开发了一个DOS下的执行程序通过串口,将最新的数据自动上传到服务器上。 编译工具 Turbo C 数据…

4.系统学习-集成学习

集成学习 前言Bias and Variance过拟合(overfitting)与欠拟合(underfitting)集成学习为什么有效?Blending 模型集成Stakcing 模型集成Bagging模型集成Bagging 模型集成算法流程:Boosting模型集成作业 前言 …

电商项目高级篇07-redisson分布式锁

redisson分布式锁 1、引入maven依赖2、config类3、可重入锁设计 1、引入maven依赖 <!--引入redisson--><dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.12.0</version></depend…

Nginx的性能分析与调优简介

Nginx的性能分析与调优简介 一、Nginx的用途二、Nginx负载均衡策略介绍与调优三、其他调优方式简介四、Nginx的性能监控 一、Nginx的用途 ‌Nginx是一种高性能的HTTP和反向代理服务器&#xff0c;最初作为HTTP服务器开发&#xff0c;主要用于服务静态内容如HTML文件、图像、视…

递归算法常见问题(Java)

问题&#xff1a;斐波那契数列,第1项和第2项都为1&#xff0c;后面每一项都为相邻的前俩项的和,求第n个数 解法&#xff1a;每一个数都为前俩个数之和&#xff0c;第1项和第2项都为1&#xff0c;所以写 方法f1(n)即为求第n个数&#xff0c;那么f1(n-1)为求第n-1个数&#xff0…

SpringBoot + HttpSession 自定义生成sessionId

SpringBoot HttpSession 自定义生成sessionId 业务场景实现方案 业务场景 最近在做用户登录过程中&#xff0c;由于默认ID是通过UUID创建的&#xff0c;缺乏足够的安全性&#xff0c;决定要自定义生成 sessionId。 实现方案 正常的获取session方法如下&#xff1a; HttpSe…

【流量、洪水数据下载】网站介绍和下载经验....不断更新!

EarthData 介绍 NASA:链接 数据下载 视频教程:Discover and Access Earth Science Data Using Earthdata Search 数据下载需要注册,已经被卡在邮箱验证上【2024-12-26】… Essential Climate Variables——【The Global Climate Observing System(GCOS) 介绍 其是支…

Pytorch | 利用SMI-FGRM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用I-FGSSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集SMI-FGRM介绍SMI-FGRM算法流程 SMI-FGRM代码实现SMI-FGRM算法实现攻击效果 代码汇总smifgrm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CI…

少儿编程在线培训系统:客户服务与学习支持

2.1 VUE技术 VUE它是由HTML代码&#xff0c;配上嵌入在HTML代码里面的Java代码组成的应用于服务器端的语言&#xff0c;使用VUE进行开发能够更加容易区分网页逻辑以及网页设计内容&#xff0c;让程序员开发思路更加清晰化&#xff0c;VUE在设计组件时&#xff0c;它是可以重用的…

流批一体向量化计算引擎 Flex 在蚂蚁的探索和实践

编者按&#xff1a;Flex是蚂蚁数据部自研的一款流批一体的向量化引擎&#xff0c;Flex是Fink和Velox的全称&#xff0c;也是Flexible的前缀&#xff0c;被赋予了灵活可插拔的寓意。本文将重点从向量化技术背景、Flex架构方案和未来规划三个方面展开论述。 作者介绍&#xff1a;…

upload-labs关卡记录11

先上传一个一句话木马试试&#xff0c;居然可以上传成功&#xff0c;复制图片链接&#xff0c;在另一个窗口打开&#xff1a; 会发现&#xff0c;我们明明上传的是shell.php&#xff0c;但是这里就是没有了php,这样我们在执行我们相关的语句的时候就无法执行了&#xff1a; 就…

WebRTC服务质量(08)- 重传机制(05) RTX机制

WebRTC服务质量&#xff08;01&#xff09;- Qos概述 WebRTC服务质量&#xff08;02&#xff09;- RTP协议 WebRTC服务质量&#xff08;03&#xff09;- RTCP协议 WebRTC服务质量&#xff08;04&#xff09;- 重传机制&#xff08;01) RTX NACK概述 WebRTC服务质量&#xff08;…

借助 obdiag,让 OceanBase 参数和变量的对比更简单

本文将介绍 obdiag 工具中参数对比和变量对比功能的适用场景和试用方法。​​​​​​​ obdiag 参数和变量对比功能的适用场景 参数对比功能适用场景 不同observer对于同一参数允许配置不同的值&#xff0c;实际生产环境中&#xff0c;用户可能因多种原因在不同observer上为同…

Net9解决Spire.Pdf替换文字后,文件格式乱掉解决方法

官方文档 https://www.e-iceblue.com/Tutorials/Spire.PDF/Program-Guide/Text/Find-and-replace-text-on-PDF-document-in-C.html C# 在 PDF 中查找替换文本 原文件如下图&#xff0c;替换第一行的新编码&#xff0c;把41230441044替换为41230441000 替换代码如下&#xff…

VBA技术资料MF246:将工作表中形状复制到WORD文档

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…