当前位置: 首页 > 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;…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...