当前位置: 首页 > news >正文

【代码随想录——数组——二刷】

数组

1. 二分查找(704)

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

1.1 二分法的第一种写法

我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right]
常规写法

func search(nums []int, target int) int {l, r := 0, len(nums)-1var mid intfor l<=r {mid  = (l+r)/2if nums[mid]==target{return mid}else if nums[mid]>target {r = mid-1}else{l = mid+1}}return -1
}

递归写法

func search(nums []int, target int) int {l, r := 0, len(nums)-1return searchBinary(nums, target,l,r)
}func searchBinary(nums []int,target,left,right int) int {if left>right{return -1}mid := (left+right)/2if nums[mid]==target{return mid}else if nums[mid]>target{return searchBinary(nums,target,left,mid-1)}else{return searchBinary(nums,target,mid+1,right)}
}

1.2 二分法的第二种写法

我们定义 target 是在一个在左闭右开的区间里,也就是[left, right)
常规写法

func search(nums []int, target int) int {l, r := 0, len(nums)var mid intfor l<r {mid  = (l+r)/2if nums[mid]==target{return mid}else if nums[mid]>target {r = mid}else{l = mid+1}}return -1
}

递归写法

func search(nums []int, target int) int {l, r := 0, len(nums)return searchBinary(nums, target,l,r)
}func searchBinary(nums []int,target,left,right int) int {if left>=right{return -1}mid := (left+right)/2if nums[mid]==target{return mid}else if nums[mid]>target{return searchBinary(nums,target,left,mid)}else{return searchBinary(nums,target,mid+1,right)}
}

1.3 相关题目推荐

1.3.1 搜索插入位置(35)

给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

你可以假设数组中无重复元素。

func searchInsert(nums []int, target int) int {return findGEIndex(nums,target)
}func findGEIndex(nums []int,target int) int{low,high := 0,len(nums)-1for low<=high{mid := low+(high-low)/2if nums[mid]>=target{high = mid-1}else{low = mid+1}}return low
}

1.3.2 在排序数组中查找元素的第一个和最后一个位置(34)

给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。
如果数组中不存在目标值 target,返回 [-1, -1]。
你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。

func searchRange(nums []int, target int) []int {res := []int{-1, -1}if len(nums) == 0 {return res}right := FindGIndex(nums, target)//判断是否存在该元素if right-1<0 || nums[right-1] != target {return res} left := FindLIndex(nums, target)res[0] = left + 1res[1] = right - 1return res
}func FindGIndex(nums []int,target int)int{low,high,mid := 0,len(nums)-1,0for low<=high{mid = low+(high-low)/2if nums[mid]>target{high = mid-1}else{low = mid+1}}return low
}func FindLIndex(nums []int,target int)int{low,high,mid := 0,len(nums)-1,0for low<=high{mid = low+(high-low)/2if nums[mid]<target{low = mid + 1}else{high = mid -1}}return high
}

1.3.3 X的平方根(69)

给你一个非负整数 x ,计算并返回 x 的 算术平方根 。
由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。
注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。

func mySqrt(x int) int {return binarySearch(x)
}func binarySearch(target int) int{low,high,mid := 0,target,0for low<=high{mid = low+(high-low)/2pow_num := mid*midif pow_num==target{return mid}else if pow_num>target{high = mid-1}else{low = mid+1}}if high*high<target{return high}else{return high-1}}

1.3.4 有效的完全平方数(367)

给你一个正整数 num 。如果 num 是一个完全平方数,则返回 true ,否则返回 false 。
完全平方数 是一个可以写成某个整数的平方的整数。换句话说,它可以写成某个整数和自身的乘积。
不能使用任何内置的库函数,如 sqrt 。

func isPerfectSquare(num int) bool {return binarySearch(num)
}func binarySearch(target int) bool{low,high,mid := 0,target,0for low<=high{mid = low+(high-low)/2pow_num := mid*midif pow_num==target{return true}else if pow_num>target{high = mid-1}else{low = mid+1}}return false    
}

2. 移除元素(27)

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。
快慢指针

func removeElement(nums []int, val int) int {fastPoint,slowPoint := 0,0for i:=0;i<len(nums);i++{if nums[i]==val{fastPoint++}else{nums[slowPoint] = nums[fastPoint]fastPoint++slowPoint++}}return len(nums)-(fastPoint-slowPoint)
}

2.1 移除排序数组中的重复项(26)

给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。

func removeDuplicates(nums []int) int {count,current := 1,nums[0]for i:=1;i<len(nums);i++{if nums[i]!=current{nums[count]=nums[i]current = nums[i]count++}}return count
}

2.2 移动零(283)

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。

func moveZeroes(nums []int)  {zeroNum,currentIndex := 0,0for i:=0;i<len(nums);i++{if nums[i]==0{zeroNum++}else{nums[currentIndex]= nums[i]currentIndex++}if zeroNum+currentIndex>len(nums){// 提前结束break}}for i:=len(nums)-zeroNum;i<len(nums);i++{nums[i]=0}
}

2.3 比较含退格的字符串(844)

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。

func backspaceCompare(s string, t string) bool {return paresStr(s)==paresStr(t)
}func paresStr(s string) string {r := []rune(s)currentIndex := 0for i := 0; i < len(r); i++ {if r[i] == '#' && currentIndex > 0 {currentIndex--}if r[i] != '#' {r[currentIndex] = r[i]currentIndex++}}return string(r[:currentIndex])
}

2.4 有序数组的平方(977)

如下

3. 有序数组的平方(977)

给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。

3.1 不太雅观的代码

func sortedSquares(nums []int) []int {firstPositiveIndex := -1lengthOfNums := len(nums)for i := 0; i < lengthOfNums; i++ {if nums[i] > 0 {firstPositiveIndex = ibreak}}if firstPositiveIndex == -1 {//全是负数的处理for i := 0; i < (lengthOfNums+1)/2; i++ {temp := nums[i] * nums[i]nums[i] = nums[lengthOfNums-i-1] * nums[lengthOfNums-i-1]nums[lengthOfNums-i-1] = temp}} else if firstPositiveIndex == 0 {//全是正数的处理for i := 0; i < lengthOfNums; i++ {nums[i] = nums[i] * nums[i]}} else {var res []intleft, right := firstPositiveIndex-1, firstPositiveIndex//全部先平方for i := 0; i < lengthOfNums; i++ {nums[i] = nums[i] * nums[i]}for left >= 0 && right < lengthOfNums {if nums[left] < nums[right] {res = append(res, nums[left])left--} else {res = append(res, nums[right])right++}}for left >= 0 {res = append(res, nums[left])left--}for right < lengthOfNums {res = append(res, nums[right])right++}return res}return nums
}

3.2 美观代码

func sortedSquares(nums []int) []int {firstPositiveIndex := -1lengthOfNums := len(nums)for i := 0; i < lengthOfNums; i++ {if nums[i] > 0 {firstPositiveIndex = ibreak}}if firstPositiveIndex == -1 {// 全是负数时reverse(nums, 0, lengthOfNums-1)return powOfArr(nums, 0, lengthOfNums-1)} else if firstPositiveIndex == 0 {// 全是正数return powOfArr(nums, 0, lengthOfNums-1)} else {reverse(nums, 0, firstPositiveIndex-1)arr1 := powOfArr(nums, 0, firstPositiveIndex-1)arr2 := powOfArr(nums, firstPositiveIndex, lengthOfNums-1)var res []intarr1Index, arr2Index := 0, 0for arr1Index < len(arr1) && arr2Index < len(arr2) {if arr1[arr1Index] < arr2[arr2Index] {res = append(res, arr1[arr1Index])arr1Index++} else {res = append(res, arr2[arr2Index])arr2Index++}}res = append(res, arr1[arr1Index:]...)res = append(res, arr2[arr2Index:]...)return res}
}// [start,end]
func reverse(nums []int, start, end int) {var temp intfor start < end {temp = nums[start]nums[start] = nums[end]nums[end] = tempstart++end--}
}// [start,end]
func powOfArr(nums []int, start, end int) []int {var res []intfor i := start; i <= end; i++ {res = append(res, nums[i]*nums[i])}return res
}

3.3 优化(寻找第一个大于0的数的下标)

基于二分查找寻找第一个大于0的数的下标

// 查找大于等于 num 的第一个数的下标
func findFirstGeNumIndex(nums []int, num int) int {low, high := 0, len(nums)-1for low <= high {mid := low + (high-low)/2if nums[mid] >= num {//保证了nums[high]最终一定小于numhigh = mid - 1} else {//low逐渐逼近大于等于num的第一个数的下标low = mid + 1}}if low < len(nums) && nums[low] >= num {return low}return -1 // 如果没有找到,返回 -1
}
// 查找大于 num 的第一个数的下标
func findFirstGNumIndex(nums []int, num int) int {low, high := 0, len(nums)-1for low <= high {mid := low + (high-low)/2if nums[mid] > num {//保证了nums[high]最终一定小于等于numhigh = mid - 1} else {//low逐渐逼近大于num的第一个数的下标low = mid + 1}}if low < len(nums) && nums[low] >= num {return low}return -1 // 如果没有找到,返回 -1
}
// 查找小于等于 num 的第一个数的下标
func findFirstLeNumIndex(nums []int, num int) int {low, high := 0, len(nums)-1for low <= high {mid := low + (high-low)/2if nums[mid] <= num {// 保证了nums[low]大于等于numlow = mid + 1} else {// high逐渐逼近小于等于 num 的第一个数的下标high = mid - 1}}if high >= 0 && nums[high] <= num {return high}return -1 // 如果没有找到,返回 -1
}// 查找小于 num 的第一个数的下标
func findFirstLNumIndex(nums []int, num int) int {low, high := 0, len(nums)-1for low <= high {mid := low + (high-low)/2if nums[mid] < num {// 保证了nums[low]大于numlow = mid + 1} else {// high逐渐逼近小于 num 的第一个数的下标high = mid - 1}}if high >= 0 && nums[high] < num {return high}return -1 // 如果没有找到,返回 -1
}

4. 长度最小的子数组(209)

给定一个含有 n 个正整数的数组和一个正整数 target 。

找出该数组中满足其总和大于等于 target 的长度最小的
子数组
[numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。

快慢指针法

func minSubArrayLen(target int, nums []int) int {slow, fast, sum := 0, 0, 0minLen := math.MaxInt32for _, num := range nums {sum += numfast++if sum >= target {for sum >= target {sum -= nums[slow]slow++}if minLen > fast-slow+1 {minLen = fast - slow + 1}}}if minLen == math.MaxInt32 {return 0}return minLen
}

4.1 水果成篮(904)

你正在探访一家农场,农场从左到右种植了一排果树。这些树用一个整数数组 fruits 表示,其中 fruits[i] 是第 i 棵树上的水果 种类 。

你想要尽可能多地收集水果。然而,农场的主人设定了一些严格的规矩,你必须按照要求采摘水果:

  • 你只有 两个 篮子,并且每个篮子只能装 单一类型 的水果。每个篮子能够装的水果总量没有限制。
  • 你可以选择任意一棵树开始采摘,你必须从 每棵 树(包括开始采摘的树)上 恰好摘一个水果 。采摘的水果应当符合篮子中的水果类型。每采摘一次,你将会向右移动到下一棵树,并继续采摘。
  • 一旦你走到某棵树前,但水果不符合篮子的水果类型,那么就必须停止采摘。
    给你一个整数数组 fruits ,返回你可以收集的水果的最大数目。

4.1.1 简单的双重循环

在第90个测试用例超时了

func totalFruit(fruits []int) int {maxNum := 0for i:=0;i<len(fruits);i++{count := GetFruitFromIndex(fruits,i)if maxNum<count{maxNum=count}}return maxNum
}func GetFruitFromIndex(fruits []int, index int)int{firstKind,secondKind := fruits[index],-1count := 1for i:=index+1;i<len(fruits);i++{if fruits[i]!=firstKind {if secondKind==-1{secondKind=fruits[i]}else if(secondKind!=fruits[i]){return count}}count++}return count
}

4.1.2 剪枝的双重循环

我们添加了一个剪枝操作,当我们获得的最大果子数大于剩下的所有树时,提前结束算法。

func totalFruit(fruits []int) int {maxNum := 0for i:=0;i<len(fruits);i++{count := GetFruitFromIndex(fruits,i)if maxNum<count{maxNum=count}// 剪枝操作if maxNum >= len(fruits)-i{return maxNum}}return maxNum
}func GetFruitFromIndex(fruits []int, index int)int{firstKind,secondKind := fruits[index],-1count := 1for i:=index+1;i<len(fruits);i++{if fruits[i]!=firstKind {if secondKind==-1{secondKind=fruits[i]}else if(secondKind!=fruits[i]){return count}}count++}return count
}

4.1.3 滑动窗口(正解)

func totalFruit(fruits []int) int {lastFruit1Index, lastFruit2Index, count := 0, -1, 1fruit1, fruit2 := fruits[0], -1maxNum := 0for i := 1; i < len(fruits); i++ {if fruits[i] != fruit1 { //不是水果1,不能放1号篮子if fruit2 == -1 { //代表篮子2还空着fruit2 = fruits[i]lastFruit2Index = i} else if fruit2 == fruits[i] { //检查2号篮子的水果种类是不是fruits[i]lastFruit2Index = i} else {// 检查if maxNum < count {maxNum = count}// 需要清空一个篮子if lastFruit1Index >= lastFruit2Index { //清空2号篮子count = i - lastFruit2Index - 1} else {//清空1号篮子,将二号篮子水果放到一号篮子上count = i - lastFruit1Index - 1fruit1 = fruit2lastFruit1Index = lastFruit2Index}fruit2 = fruits[i]lastFruit2Index = i}} else { //是水果1lastFruit1Index = i}count++}if count > maxNum {maxNum = count}return maxNum
}

4.2 最小覆盖子串(76)

给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。

解题思路:滑动窗口

func minWindow(s string, t string) string {t_arr := []rune(t)dict := make(map[rune]int)count := len(t_arr)for i := 0; i < count; i++ {dict[t_arr[i]]++}res := ""s_arr := []rune(s)left, right := 0, 0for right = 0; right < len(s_arr); right++ {value, exist := dict[s_arr[right]]if !exist {continue}dict[s_arr[right]] = value - 1if value > 0 {count--}if count == 0 { //当count==0表明此时刚好覆盖一个子串if res == "" || len(res) > right-left {res = string(s_arr[left : right+1])}//尝试进行left收缩直到不满足条件for j := left; j <= right; j++ {left++value, exist = dict[s_arr[j]]if exist {dict[s_arr[j]] = value + 1if value == 0 {count++if len(res) > right-left+1 && left-1 > 0 {res = string(s_arr[left-1 : right+1])}//不满足子串,结束收缩break}}}}}return res
}

5. 螺旋矩阵II(59)

给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix

func generateMatrix(n int) [][]int {matrix := make([][]int, 0)for i := 0; i < n; i++ {matrix = append(matrix, make([]int, n))}left, up, right, bottom := 0, 0, n-1, n-1count := 1for left <= right && up <= bottom {for i := left; i <= right; i++ {matrix[up][i] = countcount++}up++for i := up; i <= bottom; i++ {matrix[i][right] = countcount++}right--for i := right; i >= left; i-- {matrix[bottom][i] = countcount++}bottom--for i := bottom; i >= up; i-- {matrix[i][left] = countcount++}left++}return matrix
}

5.1 螺旋矩阵(54)

func spiralOrder(matrix [][]int) []int {left, up, right, bottom := 0, 0, len(matrix[0])-1, len(matrix)-1res := make([]int, len(matrix[0])*len(matrix))count := 0for left <= right && up <= bottom {for i := left; i <= right; i++ {res[count] = matrix[up][i]count++}up++if left > right || up > bottom {return res}for i := up; i <= bottom; i++ {res[count] = matrix[i][right]count++}right--if left > right || up > bottom {return res}for i := right; i >= left; i-- {res[count] = matrix[bottom][i]count++}bottom--if left > right || up > bottom {return res}for i := bottom; i >= up; i-- {res[count] = matrix[i][left]count++}left++if left > right || up > bottom {return res}}return res
}

5.2 剑指Offer-顺时针打印矩阵(29)

给的测试用例中有一个不是二维数组的空数组,需要特殊情况处理一下。

func spiralArray(matrix [][]int) []int {if len(matrix)==0{return make([]int,0)}left, up, right, bottom := 0, 0, len(matrix[0])-1, len(matrix)-1res := make([]int, len(matrix[0])*len(matrix))count := 0for left <= right && up <= bottom {for i := left; i <= right; i++ {res[count] = matrix[up][i]count++}up++if left > right || up > bottom {return res}for i := up; i <= bottom; i++ {res[count] = matrix[i][right]count++}right--if left > right || up > bottom {return res}for i := right; i >= left; i-- {res[count] = matrix[bottom][i]count++}bottom--if left > right || up > bottom {return res}for i := bottom; i >= up; i-- {res[count] = matrix[i][left]count++}left++if left > right || up > bottom {return res}}return res
}

6. 区间和

给定一个整数数组 Array,请计算该数组在每个指定区间内元素的总和。
原题:区间和

6.1 基础版本(超时)

package main
import ("fmt"
)
func main() {var n int// 读取数组的长度fmt.Scan(&n)// 读取数组的元素array := make([]int, n)for i := 0; i < n; i++ {fmt.Scan(&array[i])}// 读取区间下标并计算总和for {var a, b int_, err := fmt.Scan(&a, &b)if err != nil {break}// 计算区间 [a, b] 的总和sum := 0for i := a; i <= b; i++ {sum += array[i]}// 输出总和fmt.Printf("%d\n", sum)}
}

6.2 改进版本(没通过)

这个版本没通过的原因是因为输入输出的原因,方法没问题

package main
import ("fmt"
)
func main() {var n int// 读取数组的长度fmt.Scan(&n)// 读取数组的元素array := make([]int, n)sum := make([]int, n+1)for i := 0; i < n; i++ {fmt.Scan(&array[i])sum[i+1] = sum[i] + array[i]}//fmt.Println(sum)//读取区间下标并计算总和for {var a, b int_, err := fmt.Scan(&a, &b)if err != nil {break}// 输出总和fmt.Printf("%d\n", sum[b+1]-sum[a])}
}

6.3 改进版本(改进输入输出)

package mainimport ("bufio""fmt""os""strconv""strings"
)func main() {scanner := bufio.NewScanner(os.Stdin)// 读取数组的长度scanner.Scan()n, _ := strconv.Atoi(scanner.Text())// 读取数组的元素array := make([]int64, n)sum := make([]int64, n+1)for i := 0; i < n; i++ {scanner.Scan()array[i], _ = strconv.ParseInt(scanner.Text(), 10, 64)sum[i+1] = sum[i] + array[i]}// 读取区间下标并计算总和for scanner.Scan() {indices := strings.Fields(scanner.Text())if len(indices) < 2 {break}a, _ := strconv.Atoi(indices[0])b, _ := strconv.Atoi(indices[1])// 确保 a 和 b 在有效范围内if a < 0 || b < 0 || a >= n || b >= n || a > b {fmt.Println("Invalid range")continue}// 输出总和fmt.Printf("%d\n", sum[b+1]-sum[a])}
}

7. 开发商购买土地

在一个城市区域内,被划分成了n * m个连续的区块,每个区块都拥有不同的权值,代表着其土地价值。目前,有两家开发公司,A 公司和 B 公司,希望购买这个城市区域的土地。 现在,需要将这个城市区域的所有区块分配给 A 公司和 B 公司。然而,由于城市规划的限制,只允许将区域按横向或纵向划分成两个子区域,而且每个子区域都必须包含一个或多个区块。 为了确保公平竞争,你需要找到一种分配方式,使得 A 公司和 B 公司各自的子区域内的土地总价值之差最小。
注意:区块不可再分

思路:基于前序和后序和

package mainimport ("bufio""fmt""math""os""strconv""strings"
)func main() {scanner := bufio.NewScanner(os.Stdin)// 读取数组的长度scanner.Scan()indices := strings.Fields(scanner.Text())n, _ := strconv.Atoi(indices[0])m, _ := strconv.Atoi(indices[1])// 纵向求和和横向求和arr_x := make([]int, n)arr_y := make([]int, m)// 读取数组的元素matrix := make([][]int, n)for i := 0; i < n; i++ {scanner.Scan()row := strings.Fields(scanner.Text())matrix[i] = make([]int, m)sum := 0for j := 0; j < m; j++ {matrix[i][j], _ = strconv.Atoi(row[j])sum += matrix[i][j]}arr_x[i] = sum}for i := 0; i < m; i++ {sum := 0for j := 0; j < n; j++ {sum += matrix[j][i]}arr_y[i] = sum}// 前序和后续之和x_front, x_back := make([]int, m), make([]int, m)y_front, y_back := make([]int, n), make([]int, n)for i := 0; i < m; i++ {if i == 0 {x_front[0] = arr_y[0]x_back[m-1] = arr_y[m-1]} else {x_front[i] += x_front[i-1] + arr_y[i]x_back[m-1-i] = x_back[m-i] + arr_y[m-1-i]}}for i := 0; i < n; i++ {if i == 0 {y_front[0] = arr_x[0]y_back[n-1] = arr_x[n-1]} else {y_front[i] += y_front[i-1] + arr_x[i]y_back[n-1-i] = y_back[n-i] + arr_x[n-1-i]}}minGap := math.MaxInt32for i := 0; i < m-1; i++ {temp := x_front[i] - x_back[i+1]if temp < 0 {temp *= -1}if temp < minGap {minGap = temp}}for i := 0; i < n-1; i++ {temp := y_front[i] - y_back[i+1]if temp < 0 {temp *= -1}if temp < minGap {minGap = temp}}fmt.Println(minGap)
}

相关文章:

【代码随想录——数组——二刷】

数组 1. 二分查找(704) 给定一个 n 个元素有序的&#xff08;升序&#xff09;整型数组 nums 和一个目标值 target &#xff0c;写一个函数搜索 nums 中的 target&#xff0c;如果目标值存在返回下标&#xff0c;否则返回 -1。 1.1 二分法的第一种写法 我们定义 target 是在…...

spring-boot(4)

1.VueRouter安装与使用 2.状态管理VueX 3. 4. 5. 6....

深度学习模型:原理、架构与应用

深度学习(Deep Learning)是机器学习中的一个分支,基于人工神经网络的发展,尤其是多层神经网络的研究,使其在语音识别、图像处理、自然语言处理等领域取得了显著进展。深度学习的核心是通过大量数据的训练,学习到数据的内在结构和模式,并且具备自动从复杂的输入中提取特征…...

玩客云Armbian安装Casaos

#armbian安装docker apt install docker.io #armbian判断docker是否正常运行 systemctl status docker #查看版本 docker version #安装casaos方式一 wget -qO- https://get.casaos.io | bash #安装casaos方式二 curl -fsSL https://get.casaos.io | bash...

redis过期提醒

文章目录 redis过期提醒 redis过期提醒 有一次看redis的配置文件发现一个notify-keyspace-events配置&#xff0c;注释里边长篇大论的&#xff0c;那我得看看这是干啥的&#xff0c;看完注释内容&#xff0c;发现不得了了&#xff0c;redis竟然还有过期提醒的功能 接下来得大…...

AnaTraf | 提升网络性能:深入解析网络关键指标监控、TCP重传与TCP握手时间

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 在当今的数字化时代&#xff0c;网络的稳定性和性能对企业的运营效率至关重要。无论是内部通信、应用程序的运行&#xff0c;还是对外提供服务&#xff0c;网络都发挥着关键作用。对于网络工程师或IT运维人员…...

黑盒测试和白盒测试的具体方法(附加实际应用中的技巧和注意事项)

黑盒测试的具体方法 黑盒测试有多种具体的方法&#xff0c;以下是几种常见的黑盒测试技术&#xff1a; 等价类划分 定义&#xff1a;将输入数据划分为若干等价类&#xff0c;每个等价类中的数据被认为是等效的。目的&#xff1a;减少测试用例数量&#xff0c;同时覆盖所有可…...

基于ssm的小区物业管理系统

文未可获取一份本项目的java源码和数据库参考。 题目简介&#xff1a; 我国物权法的颁布以及经济的快速发展进一步提升了社区居民对物业服务和物业管理的要求&#xff0c;特别是对于社区安全、社区停车以及社区维修等各个方面提出了更为严格的要求。在这种背景下社区物业必须…...

4本SCI/SSCI期刊更名,10月WOS更新!速看!

期刊动态 2024年10月科睿唯安期刊目录更新 2024年10月22日&#xff0c;科睿唯安更新了WOS期刊目录&#xff0c;此次更新&#xff0c;期刊被编辑除名11本&#xff0c;停止出版1本&#xff0c;4本更名&#xff0c;停产1本&#xff0c;新增63本。 剔除期刊 11本期刊被剔 Enginee…...

麒麟v10系统安装docker镜像

最近把系统搞崩了&#xff0c;又重新安装了一个麒麟系统&#xff0c;yum更新发现不能安装docker&#xff0c;所以这里给出一个安装教程&#xff0c;分享出来&#xff0c;让大家少走弯路&#xff1a; # 配置阿里云 Centos8 镜像源&#xff0c;需要额外的一些依赖&#xff0c;而…...

基于SSM大学校医院信息管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;校医管理&#xff0c;用户管理&#xff0c;在线问诊管理&#xff0c;线上挂号管理&#xff0c;病例记录管理&#xff0c;系统管理 校医账号功能包括&#xff1a;系统首页&#xff0c;个人中心&#xf…...

【JS】如何识别一个变量是不是数组对象

文章目录 1. Array.isArray()语法示例 2. Object.prototype.toString.call()语法示例 3. instanceof 操作符语法示例 4. 检查 constructor属性语法示例 总结 在 JavaScript 中&#xff0c;有几种方法可以用来识别一个变量是否是数组对象。以下是一些常用的方法&#xff1a; 1. …...

探索 Python 幽默之源:pyjokes 库全解析

&#x1f680; 探索 Python 幽默之源&#xff1a;pyjokes 库全解析 1. 背景介绍&#xff1a;为何选择 pyjokes&#xff1f; 在紧张的编程工作中&#xff0c;幽默是一种有效的缓解压力的方式。pyjokes 是一个专为程序员设计的 Python 库&#xff0c;它提供了丰富的单行笑话&am…...

苦寻多时,终于找到!这款免费GIS工具助你轻松搞定地形切片

概述 地形切片是将大范围的地形数据分割成小块&#xff08;切片&#xff09;进行存储和展示的技术&#xff0c;常用于高效的三维地形可视化和动态加载。在实际操作中&#xff0c;可以通过GISBox等工具进行地形切片处理。今天和大家安利的GISBox 是一个用于GIS模型切片、服务分…...

OpenResty性能分析:以HelloWorld服务器为例

软考鸭微信小程序 学软考,来软考鸭! 提供软考免费软考讲解视频、题库、软考试题、软考模考、软考查分、软考咨询等服务 在Web开发领域&#xff0c;性能是衡量服务器和应用质量的重要指标之一。对于简单的HelloWorld服务器&#xff0c;虽然其功能有限&#xff0c;但通过对其性能…...

pb生成文件和反射

1.protoc生成文件 指定生成的目录和proto文件路径&#xff0c; protoc --cpp_out./ ./echo.proto // echo.proto syntax "proto3";package echo;option cc_generic_services true;message EchoRequest {string msg 1; }message EchoResponse {string msg 2; }…...

.net framework 3.5sp1安装错误卡住不动怎么解决

解决 .NET Framework 3.5 SP1 安装错误卡住的问题&#xff0c;可以尝试以下几种方法&#xff1a; 1.使用 DISM 工具&#xff1a; 将下载的 NetFx3.cab 文件放置在 C:\Windows 文件夹下。 以管理员身份打开命令提示符&#xff0c;输入以下命令&#xff1a; dism /online /En…...

毕业设计—基于 Inception-ResNet模型的皮肤癌分类系统实现

1.摘要 皮肤癌是人类最常见的恶性肿瘤&#xff0c;主要通过视觉诊断进行初步临床筛查。但是由于皮肤病变外观的细微变化性&#xff0c;使用图像自动分类皮肤病变是一项具有挑战性的任务。本文为了提高深度学习算法在皮肤病检测上的准确率&#xff0c;本文提出了基于Inception和…...

什么是优秀的单元测试?

阅读本文之前&#xff0c;请投票支持这款 全新设计的脚手架 &#xff0c;让 Java 再次伟大&#xff01; 单元测试的质量意义 合理编写单元测试&#xff0c;可使团队工程师告别牛仔式编程&#xff0c;产出易维护的高质量代码。随着单元测试覆盖率的上升&#xff0c;项目会更加…...

服务器安装Anaconda,Anaconda安装Pytorch

1.服务器安装Anaconda 1.1 下载Anaconda 在服务器上直接下载 wget https://repo.anaconda.com/archive/Anaconda3-2024.06-1-Linux-x86_64.sh1.2 安装Anaconda bash Anaconda3-2024.06-1-Linux-x86_64.sh然后就显示下面&#xff1a;more 安装过程一直enter即可&#xff0c;…...

YOLO目标检测理论详解,YOLOv1理论知识讲解,超w字精读(学习YOLO框架必备),全网最详细教程

文章目录 前言一、目标检测理论1.目标检测发展史2.目标检测框架理论基础3.本章小结 二、YOLOv1理论知识1.YOLOv1网络结构2.YOLOv1检测原理3.YOLOv1的训练流程&#xff08;1&#xff09;边界框的位置参数&#xff08;2&#xff09;边界框的置信度&#xff08;3&#xff09;类别置…...

SpringBoot3.x和OCR构建车牌识别系统

本专题旨在展示 OCR 技术与 SpringBoot3.x 框架结合的广泛应用。我们会深入探讨它在医疗、金融、教育、交通、零售、公安等多个领域的现实应用。每个应用场景都会提供详细的实例、面临问题的分析与解决策略&#xff0c;以帮助您深入理解 OCR 技术在实践中的关键作用。让我们一同…...

conda 容器学习笔记之一 -- 基础环境配置

1、容器瘦身导致部分应用缺少&#xff0c;需要在非容器环境下部署环境。但为避免破坏现有环境&#xff0c;现有使用conda环境进行隔离管理 创建&#xff1a;conda create -n tts python3.10.0 2、conda 是python环境管理&#xff0c;和python无关的东西比如cann还是会影响 下载…...

Oracle分区表改造(三):通过分区交换和分裂改造为分区表

Oracle分区表改造(三):通过分区交换和分裂改造为分区表 源表数据准备范围分区表改造:非间隔分区创建普通分区表分区交换分区分裂范围分区表改造:间隔分区创建间隔分区表分区交换分区分裂表重命名🐬 创建只有一个分区的分区表, 通过分区交换将原表变成分区表,然后分裂分…...

LeetCode 0908.最小差值 I:思维(遍历)

【LetMeFly】908.最小差值 I&#xff1a;思维&#xff08;遍历&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/smallest-range-i/ 给你一个整数数组 nums&#xff0c;和一个整数 k 。 在一个操作中&#xff0c;您可以选择 0 < i < nums.length 的…...

Python基础之循环语句

在Python的编程世界里&#xff0c;循环结构犹如一把神奇的钥匙&#xff0c;开启高效处理数据和重复执行任务的大门。它赋予程序员强大的力量&#xff0c;让代码充满活力。Python主要有两种类型的循环语句&#xff1a;for循环和while循环。 一、for循环 for循环通常用于遍历一个…...

项目管理软件真的能让敏捷开发变得更简单吗?

敏捷开发是一种以快速交付和适应变化为核心特点的软件开发方法。其特点包括尽早并持续交付、能够驾驭需求变化、版本周期内尽量不加任务、业务与开发协同工作、以人为核心、团队配置敏捷等。 例如&#xff0c;尽早并持续交付可使用的软件&#xff0c;使客户能够更早地体验产品…...

互联网名称之时间戳

什么是时间戳 时间戳&#xff08;Timestamp&#xff09;是一种用于表示特定时刻的数值或字符串&#xff0c;通常以日期和时间的形式出现。它用于记录某一事件发生的准确时间&#xff0c;在计算机系统中常被用于日志记录、数据处理和同步等场景。 常见的时间戳 在互联网中常见…...

Leetcode—1242. 多线程网页爬虫【中等】Plus(多线程)

2024每日刷题&#xff08;187&#xff09; Leetcode—1242. 多线程网页爬虫 实现代码 /*** // This is the HtmlParsers API interface.* // You should not implement it, or speculate about its implementation* class HtmlParser {* public:* vector<string>…...

RISC-V笔记——内存模型总结

1 前言 Memory consistency model定义了使用Shared memory(共享内存)执行多线程(Multithread)程序所允许的行为规范。RISC-V使用的内存模型是RVWMO(RISC-V Weak Memory Ordering)&#xff0c;RVWMO内存模型是根据全局内存顺序(global memory order)定义的&#xff0c;全局内存…...