首页 > 其他分享 >萌新也能看懂的 Golang 题解(二)

萌新也能看懂的 Golang 题解(二)

时间:2023-03-04 15:00:59浏览次数:50  
标签:遍历 萌新 题解 复杂度 算法 Golang 素数 数组 长度

第二批

1807. 矩阵转置(数学)

难度:简单;主观评价:简单。

简单模拟题+数学题(判断完全平方数)。

先判断矩阵长度是否为完全平方数(开根号然后自身相乘,判断和开根号之前的数是否一致,如果不是则直接输出 ERROR),然后开始按列遍历矩阵,每次跳过一行数字,下一行对应的位置就是下一个要处理的数字。

时间复杂度:O(n^2),其中 n 为正方形矩阵的行数,矩阵中的每个元素都会被访问一次。

空间复杂度:O(1),注意返回值所用的空间不需要参与计算。

 

1808. 整理工号(模拟)

难度:简单;主观评价:简单。

模拟题,没啥好说的,注意题目中说明的“合法工号”的判断条件。

不是合法工号的条件有:

  1. 去除所有空格后,长度大于 9 或者长度为 1。
  2. 第一个字符不是字母。
  3. 除了第一个字符之外的其他字符含有字母。

这些条件都很容易模拟,根据这些条件过滤输入数组,然后将过滤后剩下的字符串整理成题目要求的格式即可。

去重排序时需要注意 Go 语言的比较操作符在比较字符串时就是按照字典序进行比较的,所以可以直接使用比较操作符。如果遇到不是按照字典序进行排序的题目(如让你按照一定规则比较一些 IP 地址等),也可以使用 sort.Slice() 的函数参数自定义比较逻辑。

时间复杂度:O(nlogn),其中整理操作的时间复杂度为 O(m*n),n 为输入数组的长度,需要遍历输入数组一次;m 为输入数组中最长的合法工号的长度,最长为 9;O(nlogn) 为排序算法的时间复杂度;综合时间复杂度为 O(nlogn)。

空间复杂度:O(n),去重使用的哈希表占用的空间与合法工号个数成正比。

1812. 求矩阵列的最大值中的最小值(模拟)

难度:简单;主观评价:简单。

由于是找每一列的最大值,再找它们中的最小值,所以遍历矩阵的时候不能按照常规的按行遍历的方法,而是要按列遍历,每遍历一次找出一个最大值,然后找出这些最大值中的最小值。

时间复杂度:O(n*m),其中 n 和 m 为矩阵的行数和列数,矩阵中每个元素都会被遍历一次。

空间复杂度:O(1),只使用了常数个数的存储空间。

 

1813. 用给定的数字组成 IP 地址(递归回溯、全排列)

难度:简单;主观评价:中等。

一眼全排列,用递归回溯的方法进行求解。

注意答案要进行去重,例如“08”和“8”是同一个答案,可以使用 map 存储转换为 int 的字节数组进行去重。

搞不懂为什么这道题定的是简单,如果不知道递归回溯这种算法恐怕是做不出来这道题的,当然这题在递归回溯类问题中算是简单的,套一下递归回溯算法的模板就可以了,所以主观评价给个中等吧,毕竟 LeetCode 上涉及到递归回溯的题好像也没几道简单题。

时间复杂度:我实在是不会分析递归算法的时间复杂度,总之很高就对了,但不会超时。

空间复杂度:O(n),函数调用栈的深度与可用的数字个数成正比。

 

1809. 最佳升级时间窗(滑窗)

难度:中等;主观评价:简单。

一眼滑窗。

题目的难点是滑窗最长可以为周期的长度,且可以跨过周期,也就是说需要开双倍数组,或者用类似循环队列的方法解决(右指针移动时,对数组长度取模,这种方法可以将空间复杂度优化到 O(1))。

如果像我一样开双倍数组,返回时需要右指针下标对数组长度取模(样例 2)。

此外,滑窗被动收缩(左指针被动右移)的条件除了滑窗内部的数值之和大于容忍值之外,还有滑窗长度大于一个周期(需要收缩到一个周期,样例 3)。

times 变量用来记录滑窗内的数值之和,为了防止溢出需要用 uint64 类型。

以上难度都很容易想到,所以主观评价给个简单吧。

时间复杂度:O(n),需要遍历双倍数组一次。

空间复杂度:O(n),本解法中开了双倍数组模拟跨过周期的情况,需要使用与数组长度成正比的空间。

1810. 日志敏感信息屏蔽(哈希表、模拟)

难度:中等;主观评价:中等。

这题说有多难吧,也没多难,毫无算法成分就是一简单的模拟题,但是规则 3 的边界条件判断非常恶心!!!如果像考试时那样看不到不通过的测试用例的话,我绝对会在这道题上翻车的,所以主观评价给了个中等。

个人认为这种死抠细节的题比单纯的算法题难多了,最恐怖的是这种细节题不像纯算法题那样容易练习,LeetCode 上也很少有这类题目,只能说多在 OJ 上找找吧。。。

具体看注释,我翻车的地方都在注释里用“易错点”标注出来了。

细节题真的是一生之敌。

时间复杂度:O(n),需要遍历 logs 数组一次。

空间复杂度:O(n),我的解法需要将 logs 数组中的元素按照分隔符切分并保存到辅助数组中,使用的辅助数组占用的空间与 logs 数组长度成正比,可以使用直接修改 logs 数组的方法优化到 O(1)。

 

 

1811. 素数行李箱密码(BFS、层序遍历)

难度:困难;主观评价:中等。

本题与 1795. 最佳路径 相似,最大的难点是生成素数数组和想到用层序遍历 BFS 解题,算法本身是非常简单的——没错,比 1795 简单很多,甚至连邻接矩阵都不需要构造。

由于每次操作之后的结果必须都是素数,所以可以认为与当前搜索到的素数字符串仅相差一位的所有素数字符串都是“邻接于当前结点的结点”,也就是层序遍历中的“下一层”。

生成 0 - 9999 的素数可以使用素数筛算法(建议背下来),并且由于所有测试用例使用的素数集合都是相同的,所以可以使用打表的方法将这些素数提前生成并保存起来。为了节约时间,这里使用一个 []int 以从大到小的顺序保存所有的素数,并使用一个 map[string]struct{} 保存这些素数的四位字符串,以便在后续 BFS 过程中可以快速找出与当前素数字符串仅相差一位的所有素数字符串。

具体看代码吧。

时间复杂度:O(n),为 BFS 算法的时间复杂度。

空间复杂度:O(n),队列的长度与问题规模(从 initState 到 dstState 的路径长度)成正比。

 

标签:遍历,萌新,题解,复杂度,算法,Golang,素数,数组,长度
From: https://www.cnblogs.com/gongxianjin/p/17178306.html

相关文章

  • 萌新也能看懂的 Golang 题解(三)
    第三批1822.电话拦截(模拟、排序)难度:中等;主观评价:简单。sort.Slice() 应用题,重点在于通配符的判断和如何设计数据结构保证最后能按呼叫顺序返回通话记录。对于没有通......
  • golang的指针变量,智商声明没有赋值,不能直接 *p=123之类的
    packagemainimport"fmt"funcmain(){ //申明指针的时候,如果没有指向某个变量,默认值为nil //不能直接进行操作,包括读写 //而用new返回的是有默认值的指针,为数据......
  • 指针和数组笔试题解析
    在大多数情况下,数组名就是数组首元素的地址,但是有两种特殊情况:一、sizeof(数组名):当数组名单独放在sizeof内部,指的是整个数组二、&数组名:取的是整个数组的地址,但是结果和首......
  • CF1764G1 题解
    题意传送门交互库有一个\([1,n]\)的排列\(p\),你可以询问\(l,r,k\),交互库会返回\(\lfloor\dfrac{p_l}{k}\rfloor,\lfloor\dfrac{p_{l+1}}{k}\rfloor,\dots,\lfloor\d......
  • lg7335 [JRKSJ R1] 异或 题解
    本题的标签中含有trie,但是这道题可以不用trie做。考虑列出本题的dp方程:设\(f_{k,i}\)表示前\(i\)个数选了\(k\)段的答案,\(s_i\)为数组的前缀异或和当不选择第\(i\)位,使用......
  • 【题解】P6271 [湖北省队互测2014]一个人的数论
    很久之前存的古代经典题,思路是cyj的。感谢那时候先辈们的分享精神,这就是十年前的OI圈子吗。思路莫比乌斯反演。首先注意到一个自然数幂次和,令\(F(n)=\sum\limit......
  • protobuf golang&&python序列化反序列化测试
    1.概要最近考虑采用protobuf来实现kafka消息传递,所以先测试一下golang和python之前序列化互通问题。由于go和python对于二进制的表示在ide层面是无法统一的,直接把python......
  • 前端问题解决步骤
    总结,有错误看错误,没明显错误看逻辑。F12查看(看连接是否有错误。)在看NetWork查看选项Fetch/XHR(看具体接口对应相关数据是否正确)找后端代码和前端代码的逻辑问题。(swagg......
  • pdf.js 预览时红章、电子签和部分文字无法显示问题解决方案
    pdf红章无法预览的问题修复方案:node_modules/pdfjs-dist/es5/build/pdf.worker.js注释一行代码:this.setFlags(_util.AnnotationFlag.HIDDEN)pdf电子签、部分文字不......
  • lg8935 [JRKSJ R7] 茎 题解
    由于标签内包含背包和树形dp,所以考虑用背包dp和树形dp求解。考虑每次合并2个连通块(一个包含根节点),设\(f_{i,j}\)表示\(i\)子树内,操作\(j\)次的方案数(未合并连通块),设\(f_{i......