GO操作其他编程语言代码-命令行,shell,C,python 我们在开发过程中免不了要执行其他编程语言写的代码。下面通过几个例子来示示范。一、命令行执行命令行并且输出结果:func main() { cmdStr:="ps" cmd:=exec.Command(cmdStr,"-ef") output,err:=cmd.Output() if err!=nil{ panic(err) } fmt.Println("get %s result:",string(output))}执行命令行但是不需要输出结果:fun
【leetcode前500】零钱兑换1+2 我们先观察第一个问题,问题中的黑体字是最少的硬币个数。如果令dp[i]是组合成金额i需要的最少硬币个数,那么很显然dp[i]=min(1+dp[i-c]),其中c是任意一个硬币的值。也就是说,最终用到的硬币个数,应当是一个面值为c的,加上总金额i-c对应的硬币个数。代码如下class Solution: def coinChange(self, coins: List[int], amount: int) -> int: coins.sort() ..
剑指offer题集 因为面试前需要快速过一遍剑指offer,共68道,题目太多非常耗费时间,在此只做一遍值得一做的题目。凭我个人的能力(约100+道leetcode水平)是可以完全忽略一些题目的。这里仅给出python代码及思路1.两个栈实现一个队列。此题不难,但是需要考虑减少无用操作,时刻记住第二个栈已经是倒序的了,所以只要没pop完就不要再往里append。class CQueue: def __init__(self): self.stk1=[] self.st
【leetcode前500】144+94+145:二叉树的非递归前序/中序/后序遍历 用栈模拟递归形式,值得考虑的是,左子树入栈的时候就先把节点保存好即可。对应的是ret.append(root.val)dfs(root.left)dfs(root.right)class Solution: def preorderTraversal(self, root: TreeNode) -> List[int]: ret=[] stk=[] p=root while p: ...
【leetcode前500】439. 三元表达式解析器 题目给了提示,我们需要从右往左结合,这个时候要用到栈。考虑示例3,可以看出我们应当在从右往左遍历到问号时,再对后面的表达式判断,这个时候我们需要对栈进行两种操作:如果是T,那么将栈第二个元素弹出去如果是F,弹出第一个值得去注意的是有的时候栈里保存的不全是数字,也可能是TF,我们需要在搜索到‘?'的时候立即注意到下一个字符的T或者F将会对栈操作。class Solution: def parseTernary(self, expression: str) ->...
【leetcode前500】440. 字典序的第K小数字 思考一个问题,字典序的话,我们构造一个数字时,前缀是pre那么,递增和拼接哪个更大?举例示例里面的,前缀是1,递增是2,拼接(变成10,11),看来拼接是字典序更小的。首先我们需要找到一个前缀下所有元素的个数,比如前缀是1,n=125,那么在这颗树下的个数一共有1+10+10+10+6(1,10....19,100...125)。如果我们把这下面所有的节点加到排序里面,但是还未到达相应的序号,那就递增前缀,使其快速的变大;否则我们*10让其缓慢的变大。class Solution: ..
【leetcode前500】442. 数组中重复的数据 一般考虑这种题目,通用解法就是将原数组当成哈希表操作(因为元素都是1-n)。这里面需要考虑的是怎样用原数组达到要求。首先我们考虑如何将一个数字标记为已访问过:可以将其置为他的负值。遍历过程中,我们只要发现对应位置上的数组已经被置为负值了,那么就认为是出现第二次了,保存结果。class Solution: def findDuplicates(self, nums: List[int]) -> List[int]: ret=[] for k ..
【leetcode前500】446. 等差数列划分 II - 子序列 我们观察下面的数据长度,那么平方级别时间应该是足够了。这里示例给了一个很好的例子,可以看出是可以重复的。我们选定一个以x结尾的序列,遍历它前面的数字y,设公差为d,那么以y结尾的所有序列且公差为d的序列个数加1就是以x结尾的公差为d的个数。需要注意的是,这里公差可能的范围非常大,将二维数组的第二维度换成字典保存公差d,这样就得到下列代码,需要注意的是,最终结果是返回所有可以成为等差序列的序列个数。class Solution: def numberOfArithmeticSlice..
【leetcode前500】452. 用最少数量的箭引爆气球 一般对于这种区间计算的题,首先想到的是先排序,把区间弄得有序然后再分段计算。这里我们需要考虑的是一箭射爆多个气球的情况,我们可以在数轴上画画图,只要尽量重合,那就能尽量多的射爆。所以为了让他们重合,我们需要不断计算重合区间,直到下一气球再也无法重合为止。复杂度是O(nlogn)。class Solution: def findMinArrowShots(self, points: List[List[int]]) -> int: points.sort() ...
【leetcode前500】454. 四数相加 II 这题其实挺有意思的。如果我们采用一个哈希表保存a+b+c,遍历D获取和为0个数那么 是O(N)+O(N^3)如果我们采用一个哈希表保存d,遍历A+B+C,那么和上面一样。但是如果我们采用一个哈希表保存a+b,遍历C+D,那么时间是O(N^2)+O(N^2)class Solution: def fourSumCount(self, nums1: List[int], nums2: List[int], nums3: List[int], nums4: List[int]) ...
【leetcode前500】456. 132 模式 按经验应当使用一个单调栈,但是这里的用法比较奇特,需要从后往前遍历。我们考虑递减栈pop过程中被弹出去的元素,如果能够找到一个比前面的大的,就说明成功了。试想[-1,3,2,0]栈增长分别为[0]--[2],那么0就是被弹出的元素。被弹出说明了两件事情:1,前面必定有一个比他大的元素。2,只要前面再有一个比它小的那么查找就完成了。我们用一个变量保存被弹出的最大值,只要遍历时发现有数字比这个值小,就好了。class Solution: def find132pattern...
【leetcode前500】457. 环形数组是否存在循环 其实这种题,对于查找环的问题,我们应该立即想到快慢指针,但是对于一个整体的设计,确实没有一下子想出来。1.如何去除重复路径的问题。我们观察数组元素是正数或者负数,因此我们用遍历置零的办法去掉重复路径搜索。2.同方向的问题。题目中要求成环条件是下标是同一方向的,也就是应当全为正数或者全为负数,遍历过程中应当与快指针节点以及快指针的下一个节点比较符号即可。3.特殊情况比如[2,1],一直重复2-2-2....这样是要过滤掉的class Solution: def circu...
【leetcode前500】458. 可怜的小猪 这是一道纯数学分析题,首先我们考虑minToDie和minToTest,这两个表明了可用的“批次”。比如示例1,p=60/15=4,说明我们可以用n头猪,测试p=4次。不妨假设毒药总是在最后一桶,而且测试总是从小到大开始测试。假设n=1,也就是仅有一头猪,测试p=4次,可能的结果是:1.第一次测试就中毒;2.躲过第一次,第二次中毒;3.躲过第二次,第三次中毒;4.躲过第三次,第四次中毒;5.躲过第四次,依然存活。那么对于这一只猪可能有五种状态,s=p+1。接下...
【leetcode前500】459. 重复的子字符串 暴力法就不说了,官方给的一个解法挺有意思的。假设S=ss....s也就是由多个重复串组成,那么只要把第一个s移到最后面也是能够构成S的。比如S=abcaabcaabca ==>S=[abca][abcaabca]。这个时候我们令S'=[abca][abcaabca][abca][abcaabca]可以看出中间肯定是包含S的,哪怕去掉首位两段,如果这重复串非常小S=aaa,那么S'=[a][aa][a][aa],如果去掉首位两段也能获得S,那么说明也是。因此我们把新串掐头去尾,看...
【leetcode前500】460. LFU 缓存 此题有两个需要注意的点,最近-最少未使用。比如说我们有几个键值对,那么,如果要淘汰一个的话按照题意“存在相同使用频率应该去除最近最久未使用的”,应当先比较计数器,不相等淘汰计数器最少的;若计数器相等,那么淘汰最晚加入的。我们在类内部维护一个时间戳,只要进入一个操作内,时间戳就+1来维护时间序列。剩下的是就是节点的更新工作,在本题刚开始时,准备使用堆来维护节点,以哈希表来维护键,但事实实际上用树状结构足够了,因为维护的代价都是log(n)。需要注意的就是节点的先删除再插入,在这个过程中,更新计..
【leetcode前500】463. 岛屿的周长 很容易我们能观察出,一个块能带来4条边,但是一旦有邻接就会损失2条。我们需要计算的是1.一共多少个块,这个很容易,遍历即可2.判断它的每条边是否是邻接的一旦邻接,就把总数减一,因为遍历到他的邻接块还会计算一次。class Solution: def islandPerimeter(self, grid: List[List[int]]) -> int: def check(i,j): if 0<=i<len(grid..
【leetcode前500】464. 我能赢吗 令maxn=maxChooseableInteger,total=desiredTotal。如果maxn大于等于total,那么先手一次拿取就获胜,直接返回。如果1+2...maxn都是小于total的,那么无论怎么取,先手都不能获胜,直接返回。对于博弈论的函数,一般模式我们判定需要的是:check(...当前状态)= true if not check(下一状态,也就是对手的状态)else false为最基本的模板,这里因为要时刻记住1~maxn的数字到底被用过了没有,并且要...
【leetcode前500】467.环绕字符串中的唯一子串 我们可以先忽略他奇奇怪怪的定义,考虑一个数字序列共有多少个连续子串。比如[0,1,2,5,6]那么应该是"0","1","2","5","6","01","12","56","012"。观察很容易得出,如果分类为以某个数字结尾的连续子串个数,那么"2"==>3;"1"==>2;"0"==>1;"5"==>1;"6"==>2;很显然就是需要在遍历的过程中计算出前方有多少个数字是连着的,然后将这个连续值取到最大。在判断有序的过程中其实就已...