分别用Python和Go实现对文件夹及其子文件夹里的文件进行批量重命名
最近在继续提高自己的go技术时,从网上一些平台获取到了一些学习资料,然后下载到本地后,文件的命名是真的像衣托答辩:
除了上述的文件,还有一mol多神奇的命名,害,由于资料是从小道途径获得的,咱就忍了。接下来就是要批量对这些文件改名的问题,我粗略算了下,有上千个的文件需要改。对于程序员来说,总不能挨个挨个文件重命名吧,于是我就写了两个脚本,一个python版本,一个go版本,均能批量对文件夹及其子文件夹里的文件进行批量重命名,去掉烦人的”信息”,亲测体检较好。
下面附上两个版本的代码:
Python:
123456789101112131415161718192021import os# 要处理的根文件夹路径root_folder = '/path/to/your/root/folder'# 要去掉的字符串string_to_remove = "【加微信.赠送精品IT课程】"# 遍历根文件夹及其子文件夹for folder_path, _, file_names in os.walk(root_folder): for file_name ...
Go语言的单元测试与基准测试
单元测试以一个加法函数为例,对其进行单元测试。
首先编写add.go文件:
123456//add.gopackage mainfunc add(a, b int) int { return a + b}
其次编写add_test.go文件,在go语言中,测试文件均已_test结尾,这里只需要在被测试的文件后加上_test即可。并且测试文件与要被测试的文件需要放在同一个包中,并不像Java那样需要将所有的测试文件放在一个专门的测试文件夹里面,例如我将这两个文件都放在main包下:
123456789101112131415package mainimport ( "fmt" "testing")//测试函数需要以Test开头func TestAdd(t *testing.T) { fmt.Println("Running short test") res := add(1, 2) if res != 3 { t.Errorf("add(1,2) should be 3, g ...
leetcode链表必刷题——移除链表元素、设计链表、反转链表、两两交换链表中的节点、删除链表的倒数第 N 个结点、相交链表、环形链表、环形链表 II
移除链表元素题目链接
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:
12输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]
示例 2:
12输入:head = [], val = 1输出:[]
示例 3:
12输入:head = [7,7,7,7], val = 7输出:[]
提示:
列表中的节点数目在范围 [0, 104] 内
1 <= Node.val <= 50
0 <= val <= 50
Python:
12345678910111213141516171819202122#本人解法# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclass Solu ...
leetcode哈希表必刷题——有效的字母异位词、两个数组的交集、快乐数、两数之和、四数相加 II、赎金信、三数之和、四数之和
有效的字母异位词题目链接
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。
示例 1:
12输入: s = "anagram", t = "nagaram"输出: true
示例 2:
12输入: s = "rat", t = "car"输出: false
提示:
1 <= s.length, t.length <= 5 * 104
s 和 t 仅包含小写字母
Python:
123456789101112# 数组class Solution: def isAnagram(self, s: str, t: str) -> bool: if len(s) != len(t): return False c1 = [0] * 26 c2 = [0] * 26 for ch in s: ...
排序
排序评价维度:
运行效率:我们期望排序算法的时间复杂度尽量低,且总体操作数量较少(即时间复杂度中的常数项降低)。对于大数据量情况,运行效率显得尤为重要。
就地性:顾名思义,原地排序通过在原数组上直接操作实现排序,无须借助额外的辅助数组,从而节省内存。通常情况下,原地排序的数据搬运操作较少,运行速度也更快。
稳定性:稳定排序在完成排序后,相等元素在数组中的相对顺序不发生改变。稳定排序是多级排序场景的必要条件。假设我们有一个存储学生信息的表格,第 1 列和第 2 列分别是姓名和年龄。在这种情况下,非稳定排序可能导致输入数据的有序性丧失。
12345678910111213141516# 输入数据是按照姓名排序好的# (name, age) ('A', 19) ('B', 18) ('C', 21) ('D', 19) ('E', 23)# 假设使用非稳定排序算法按年龄排序列表,# 结果中 ('D', 19) 和 ('A', 19) ...
leetcode数组必刷题——二分查找、移除元素、有序数组的平方、长度最小的子数组、螺旋矩阵、螺旋矩阵 II
二分查找题目链接
给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
示例 1:
123输入: nums = [-1,0,3,5,9,12], target = 9输出: 4解释: 9 出现在 nums 中并且下标为 4
示例 2:
123输入: nums = [-1,0,3,5,9,12], target = 2输出: -1解释: 2 不存在 nums 中因此返回 -1
提示:
你可以假设 nums 中的所有元素是不重复的。
n 将在 [1, 10000]之间。
nums 的每个元素都将在 [-9999, 9999]之间。
Python:
123456789101112class Solution: def search(self, nums: List[int], target: int) -> int: i, j = 0, len(nums) - 1 while i <= j: mid ...
搜索
搜索二分查找二分查找是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮减少一半搜索范围,直至找到目标元素或搜索区间为空为止。
Question:
给定一个长度为n的数组 nums ,元素按从小到大的顺序排列,数组不包含重复元素。请查找并返回元素 target 在该数组中的索引。若数组不包含该元素,则返回 −1
双闭区间如下图所示,我们先初始化指针i=0 和 j=n−1 ,分别指向数组首元素和尾元素,代表搜索区间 [0,n−1] 。请注意,中括号表示闭区间,其包含边界值本身。
接下来,循环执行以下两步。
计算中点索引 m=⌊(i+j)/2⌋ ,其中 ⌊⌋ 表示向下取整操作。
判断 nums[m] 和 target 的大小关系,分为以下三种情况。
当 nums[m] < target 时,说明 target 在区间 [m+1,j] 中,因此执行 i=m+1 。
当 nums[m] > target 时,说明 target 在区间 [i,m−1] 中,因此执行 j=m−1 。
当 nums[m ...
图
图图是一种非线性数据结构,由顶点和边组成。我们可以将图 (G) 抽象地表示为一组顶点 (V) 和一组边 (E) 的集合。以下示例展示了一个包含 5 个顶点和 7 条边的图。
V = { 1, 2, 3, 4, 5 } &E = { (1,2), (1,3), (1,5), (2,3), (2,4), (2,5), (4,5) } &G ={ V, E }
如果将顶点看作节点,将边看作连接各个节点的引用(指针),我们就可以将图看作是一种从链表拓展而来的数据结构。相较于线性关系(链表)和分治关系(树),网络关系(图)的自由度更高,从而更为复杂。
基础知识根据边是否具有方向,可分为无向图和有向图。
在无向图中,边表示两顶点之间的“双向”连接关系,例如微信或 QQ 中的“好友关系”。
在有向图中,边具有方向性,两个方向的边是相互独立的,例如微博或抖音上的“关注”与“被关注”关系。
根据所有顶点是否连通,可分为连通图和非连通图。
对于连通图,从某个顶点出发,可以到达其余任意顶点。
对于非连通图,从某个顶点出发,至少有一个顶点无法到达。
...
LeetCode 热题 100——两数之和、字母异位词分组、最长连续序列
两数之和题目链接
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
123输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
12输入:nums = [3,2,4], target = 6输出:[1,2]
示例 3:
12输入:nums = [3,3], target = 6输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案
Python:
12345678910#暴力解法class Solution: def twoSum(self, nums: List[in ...
堆
堆堆是一种满足特定条件的完全二叉树,主要可分为下图所示的两种类型。
大顶堆:任意节点的值 ≥ 其子节点的值。
小顶堆:任意节点的值 ≤ 其子节点的值。
堆作为完全二叉树的一个特例,具有以下特性。
最底层节点靠左填充,其他层的节点都被填满。
我们将二叉树的根节点称为“堆顶”,将底层最靠右的节点称为“堆底”。
对于大顶堆(小顶堆),堆顶元素(即根节点)的值分别是最大(最小)的。
常用操作许多编程语言提供的是优先队列,这是一种抽象数据结构,定义为具有优先级排序的队列。实际上,堆通常用作实现优先队列,大顶堆相当于元素按从大到小顺序出队的优先队列。从使用角度来看,我们可以将“优先队列”和“堆”看作等价的数据结构。
堆的常用操作见下表 ,方法名需要根据编程语言来确定。
方法名
描述
时间复杂度
push()
元素入堆
O(logn)
pop()
堆顶元素出堆
O(logn)
peek()
访问堆顶元素(大 / 小顶堆分别为最大 / 小值)
O(1)
size()
获取堆的元素数量
O(1)
isEmpty()
判断堆是否为空
O(1)
...