每周算法(week2)【leetcode11~30】

 前言

        本该两周完成的30道算法题没想到5天就完成了,接下来继续刷算法,保持手感,对不熟悉的基础算法二分、搜索还得继续练。

leetcode 编号完成时间复习时间
11. 盛水最多的容器2024-07-02
12. 整数转罗马数字2024-07-02
13. 罗马数字转整数2024-07-02
14. 最长公共前缀2024-07-02
15. 三数之和2024-07-02
16、最接近的三数之和

2024-07-03

17、电话号码的字母组合2024-07-03
18、四数之和2024-07-03
19、删除链表倒数第N个节点2024-07-03
20、有效的括号2024-07-04
21、合并两个有序的链表2024-07-04
23、合并K个升序链表2024-07-05
24、两两交换链表中的节点2024-07-05
25、K个一组翻转链表2024-07-05
26、删除有序数组中的重复项2024-07-05
27、移除元素
28、找出字符串中第一个匹配项的下标2024-07-05
30、串联所有单词的子串2024-07-05

11、盛水最多的容器(双指针)

11.1、暴力枚举

思路💡:枚举每种左右高度的组合,直到取到最大值
时间复杂度🕖:O(n2)

class Solution {
    public int maxArea(int[] height) {
        int max = 0;
        for(int i=0;i<height.length-1;i++){
            for(int j=i+1;j<height.length;j++){
                int high = Math.min(height[i],height[j]);
                int width = j-i;
                max = Math.max(max,high*width);
            }
        }
        return max;
    }
}

 11.2、双指针

思路💡:左右指针

  • 虽然指针每移动一次,容器的宽度 -1,但是如果移动得到的"回报"——边界的高度变得更高,那就是值得的

时间复杂度🕖: O(N)

class Solution {
    public int maxArea(int[] height) {
        int max = 0;
        int left = 0,right = height.length - 1;
        while(left < right){
            int area = Math.min(height[left],height[right])*(right-left);
            if(height[left] <= height[right]){
                left++;
            }else{
                right--;
            }
            max = Math.max(max,area);
        }
        return max;
    }
}

12、整数转罗马数字(数学 + 模拟)

12.1、模拟

思路💡:从千位到个位,对每一位进行逻辑模拟
时间复杂度🕖:O(1)

class Solution {
    static Map<Integer,Character> map = new HashMap<>();
    static{
        map.put(1,'I');
        map.put(5,'V');
        map.put(10,'X');
        map.put(50,'L');
        map.put(100,'C');
        map.put(500,'D');
        map.put(1000,'M');
    }
    public String intToRoman(int num) {
        StringBuilder sb = new StringBuilder();
        if(String.valueOf(num).length()>3){
            int q = num/1000;
            while(q!=0){
                sb.append(map.get(1000));
                q--;
            }
            num %= 1000;
        }
        if(String.valueOf(num).length()>2){
            int b = num/100;
            while(b!=0) {
            	if(b >=5 && b < 9) {
                	sb.append(map.get(500));
                	b-=5;
                }else if(b==4) {
                	sb.append("CD");
                	break;
                }else if(b==9) {
                	sb.append("CM");
                	break;
                }else {
                	while(b!=0){
                        sb.append(map.get(100));
                        b--;
                    }	
                }	
            }  
            num %= 100;
        }
        if(String.valueOf(num).length()>1){
            int s = num/10;
            while(s!=0) {
            	if(s<9 &&  s>=5){
                    sb.append(map.get(50));
                    s-=5;
                }else if(s==4){
                    sb.append("XL");
                    break;
                }else if(s==9){
                    sb.append("XC");
                    break;
                }else{
                    while(s != 0){
	                    sb.append(map.get(10));
	                    s--;
                    }
                }
            }
            num %= 10;
        }
        while(String.valueOf(num).length()>0 && num>0){
            if(num <9 && num >= 5){
                sb.append(map.get(5));
                num-=5;
            }else if(num == 4){
                sb.append("IV");
                break;
            }else if(num == 9){
                sb.append("IX");
                break;
            }else{
                while(num!=0){
                    sb.append("I");
                    num--;
                }
            }
        }
        return sb.toString();
    }
}

13、罗马数字转整数(模拟)

13.1、模拟

思路💡:从高位到低位,在判断当前位对应数值的同时向低一位判断一下,因为罗马数字只有相邻位置可以进行减法表示(比如 49 可以表示为 IX)
时间复杂度🕖:O(1)

class Solution {
    static Map<Character,Integer> map = new HashMap<>();
    static{
        map.put('I',1);
        map.put('V',5);
        map.put('X',10);
        map.put('L',50);
        map.put('C',100);
        map.put('D',500);
        map.put('M',1000);
    }
    public int romanToInt(String s) {
        int res = 0;
        int index = 0;
        while(index+1<s.length()){
            if(map.get(s.charAt(index)) >= map.get(s.charAt(index+1))){
                res += map.get(s.charAt(index));
                index++;
            }else{
                res += (map.get(s.charAt(index+1)) - map.get(s.charAt(index)));
                index+=2;
            }
        }
        if(index < s.length()){
                res += map.get(s.charAt(index));
        }
        return res;
    }
}

14、最长公共前缀(二分搜索)

14.1、枚举

思路💡:木桶原理,最长公共前缀取决于"最混蛋"的那个字符串(任意一个字符串的第 1 个前缀字符和别的字符串不一样,就算别的 9999 个字符串都完全一样也没用,它们的公共前缀就是 0)。所以我们可以拿任意一个字符串当做模板和别的所有字符串进行对比。

时间复杂度🕖:O(mn),其中 m 是字符串数组中的字符串的平均长度,n 是字符串的数量。

class Solution {
    public String longestCommonPrefix(String[] strs) {
        char[] prefix = strs[0].toCharArray();
        StringBuilder sb = new StringBuilder();
        for(char c : prefix){
            sb.append(c);
            for(String str : strs){
                if(!str.startsWith(sb.toString())){
                    return sb.substring(0,sb.length()-1).toString();
                }
            }
        }
        return sb.toString();
    }
}

14.2、二分搜索

思路💡:前缀的长度范围超不出数组中最短的字符串长度,所以使用二分不断寻找可能的 mid 值,也就是最长的前缀长度

时间复杂度🕖:二分查找的迭代执行次数是 O(logm),每次迭代最多需要比较 mn 个字符,因此总时间复杂度是 O(mnlogm)。其中 m 是字符串数组中的字符串的最小长度,n 是字符串的数量。

知识点🙉:这里的二分搜索是左闭右闭的,所以 while 条件是 left < right,而不是 left <= right;

class Solution {
    public String longestCommonPrefix(String[] strs) {
        int minLength = Integer.MAX_VALUE;
        for(String str : strs)
            minLength = Math.min(minLength,str.length());
        int left = 0,right = minLength;
        while(left < right){
            // (right - left + 1) 中 +1 的原因是我们mid的意义是长度,而不是索引
            int mid = (right - left + 1) / 2 + left;
            if(isSamePrefix(strs,mid))
                left = mid;
            else
                right = mid - 1;
        }
        return strs[0].substring(0,left);
    }
    public boolean isSamePrefix(String[] strs,int length){
        String suffix = strs[0].substring(0,length);
        for(int i=1;i<strs.length;i++)
            if(!strs[i].startsWith(suffix))
                return false;
        return true;
    }
}

15、三数之和(双指针)

15.1、暴力枚举

思路💡:三层遍历

时间复杂度🕖:O(n3)

知识点🙉:这里唯一收获的东西就是:使用 list.contains() 判断元素相同的集合对象进行去重

class Solution {
    List<List<Integer>> res = new ArrayList<>();
    public List<List<Integer>> threeSum(int[] nums) {
        for(int i=0;i < nums.length-2;i++){
            for(int j=i+1;j < nums.length-1;j++){
                for(int k=j+1;k < nums.length;k++){
                    if(nums[i]+nums[j]+nums[k]==0){
                        put(nums[i],nums[j],nums[k]);
                    }
                }
            }
        }
        return res;
    }
    public void put(int v1,int v2,int v3){
        List<Integer> list = new ArrayList<>();
        list.addAll(Arrays.asList(v1,v2,v3));
        Collections.sort(list);
        if(!res.contains(list)) res.add(list);
    }
}

15.2、双指针

思路💡:

  • 首先对数组排序,不然无法判断指针应该如何移动
  • 这道题在使用双指针时有一个特别需要注意的就是:当左指针或右指针对应当前值和下一个值相同时,得到的结果会有重复,所以在每次循环前后都会对重复值进行处理

时间复杂度🕖:O(n2)

class Solution {
    public List<List<Integer>> threeSum(int[] nums) {
        int n = nums.length;
        List<List<Integer>> ans = new ArrayList<List<Integer>>();

        Arrays.sort(nums);
        //确定第一个数
        for(int i = 0;i < n ;i ++)
        {
            // 当起始的值等于前一个元素,那么得到的结果将会和前一次相同
            if(i != 0 && nums[i] == nums[i - 1]) continue;
            int l = i + 1,r = n - 1;

            while(l < r)
            {
                int sum = nums[i] + nums[l] + nums[r];
                if(sum > 0) 
                {
                    r --;
                    continue;
                }
                if(sum < 0)
                {
                    l ++;
                    continue;
                }
                //sum == 0时
                ans.add(Arrays.asList(nums[i],nums[l],nums[r]));
                //去除重复处理
                do {l ++;} while(l < r && nums[l] == nums[l - 1]);
                do {r --;} while(l < r && nums[r] == nums[r + 1]);
            }

        }
        return ans;
    }
}

16、最接近的三数之和(双指针)

16.1、双指针

思路💡:首先对数组进行排序,然后枚举三数之和中的第一个数字,剩下的两个数字用左右指针寻找,不断逼近和目标值最近的两个数

时间复杂度🕖:O(n2)

class Solution {
    public int threeSumClosest(int[] nums, int target) {
        Arrays.sort(nums);
        int ans = Integer.MAX_VALUE;
        for(int i=0;i<nums.length;i++){
            int l = i+1,r = nums.length-1;
            while(l < r){
                int sum = nums[i] + nums[l] + nums[r];
                ans = Math.abs(sum-target)<Math.abs(ans-target)?sum:ans;
                if(sum > target)    r--;
                else if (sum < target)  l++;
                else if (sum == target) return target;
            }
        }
        return ans;
    }
}

17、电话号码的字母组合(深搜)

17.1、深度优先搜索

思路💡:组合问题,直接深搜

时间复杂度🕖:O(3^m ×4^n ),其中 m 是输入中对应 3 个字母的数字个数(包括数字 2、3、4、5、6、8),n 是输入中对应 4 个字母的数字个数(包括数字 7、9)

class Solution {
    Map<Integer, Character[]> map = new HashMap<Integer, Character[]>();
	{
		int index = 'a';
		for (int i = 2; i < 7; i++) {
			Character[] arr = new Character[3];
			for (int j = 0; j < arr.length; j++) arr[j] = (char)index++;
			map.put(i, arr);
		}
        map.put(7, new Character[]{'p','q','r','s'});
        map.put(8, new Character[]{'t','u','v'});
		map.put(9, new Character[]{'w','x','y','z'});
	}
	List<String> res = new ArrayList<>();
	List<String> letterCombinations(String digits) {
        if(digits.length()==0) return res;

        backtrack(digits,0,"");
		return res;
    }
	public void backtrack(String digits,int index,String str){
        if(index == digits.length()){
            res.add(str);
            return;
        }
        for(char s : map.get(Integer.parseInt(""+digits.charAt(index)))){
            backtrack(digits,index + 1,str + s);
        }
    }
}

18、四数之和(双指针)

18.1、双指针

思路💡:同样对数组先排序,前两个数使用枚举,后两个数用双指针优化

时间复杂度🕖:O(n3)

class Solution {
    public List<List<Integer>> fourSum(int[] nums, int target) {
        List<List<Integer>> list = new ArrayList<>();
        if(nums.length == 0) return new ArrayList<>();
        int n = nums.length;
        Arrays.sort(nums);
        // 定下nums[i]
        for(int i = 0;i < n;i++){
            // 去重
            if(i != 0 && nums[i] == nums[i - 1]) continue;
            // 定下nums[j]
            for(int j = i + 1;j < n - 2;j++){
                // 去重
                if(j != i+1 && nums[j] == nums[j-1]) continue;
                int k = j + 1,m = n-1;
                // 双指针
                while(k < m){
                    int sum = nums[i] + nums[j] + nums[k] + nums[m];
                    if(sum > target){
                        m--;
                        continue;
                    }
                    if(sum < target){
                        k++;
                        continue;
                    }else if(sum == target){
                        list.add(Arrays.asList(nums[i],nums[j],nums[k],nums[m]));
                    }
                    // 去重
                    do{k++;}while(k < m && nums[k] == nums[k - 1]);
                    do{m--;}while(k < m && nums[m] == nums[m + 1]);
                }
            }
        }
        return list;
    }
}

19、删除链表最后一个节点

思路💡:删除倒数第 N 个节点就是删除正数第 L - N +1 个节点

时间复杂度🕖:O(L),L 是链表的长度

class Solution {
    public ListNode removeNthFromEnd(ListNode head, int n) {
        // 如果链表只有一个元素还要删除就直接返回空
        if(head.next == null && n==1) return null;
        // 计算链表的长度
        ListNode t1 = head;
        int len = 1;
        while(t1.next != null){
            len++;
            t1 = t1.next;
        }
        int target = len - n + 1; // 倒数第n个就是正数第(len-n+1)个元素
        int cur = 1; // 当前节点位置
        if(cur == target) return head.next; // 如果当前位置就是要删除的元素就直接返回下一个节点
        t1 = head; // 重新初始化
        while(cur != target-1){ // 找到要删除的目标节点的前一个节点
            t1 = t1.next;
            cur++;
        }
        // 如果目标节点的下一个节点为空就置当前节点的下一个节点为空 否则连接下下一个节点
        if(t1.next.next != null) t1.next = t1.next.next; else t1.next = null;
        return head;
    }
}

20、有效的括号

20.1、栈

思路💡:右括号总是出现在第偶数次的,否则说明括号不合法

时间复杂度🕖:O(N)

class Solution {
    public boolean isValid(String s) {
        if(s.length() %2 != 0) return false;
        Map<Character,Character> map = new HashMap<>();
        map.put(')','(');
        map.put('}','{');
        map.put(']','[');
        Deque<Character> stack = new ArrayDeque<>(); 
        for(int i=0;i<s.length();i++){
            if(i!=0 && stack.peek()!=null && stack.peek() == map.get(s.charAt(i))){
                stack.pop();
                continue;
            }
            stack.push(s.charAt(i));
        }
        return stack.size() == 0;
    }
}

21、合并两个有序链表 

思路💡:借助一个中间指针,穿针引线

时间复杂度🕖:O(L),L 是链表的长度

class Solution {
    public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        if(list1==null) return list2;
        if(list2==null) return list1;

        ListNode dummy = new ListNode();
        ListNode cur = dummy;
        while(list1 != null && list2!=null){
            if(list1.val <= list2.val){
                cur.next = list1;
                list1 = list1.next;
            }else{
                cur.next = list2;
                list2 = list2.next;
            }
            cur = cur.next;
        }
        cur.next = list1==null?list2:list1;
        return dummy.next;
    }
}

23、合并K个有序链表

思路💡:把链表问题转为数组问题

时间复杂度🕖:O(n2)

class Solution {
    public ListNode mergeKLists(ListNode[] lists) {
        if(lists ==null || lists.length==0) return null;
        List<Integer> list = new ArrayList<>();
        for(ListNode node : lists){
            while(node != null){
                list.add(node.val);
                node = node.next;
            }
        }
        Collections.sort(list);
        ListNode res = new ListNode();
        if(list.size()==0) return null;
        ListNode t = new ListNode(list.get(0));
        res.next = t;
        for(int n: list){
            t.next = new ListNode(n);
            t = t.next;
        }
        return res.next.next;
    }
}

24、两两交换链表中的节点

思路💡:把链表问题转为数组问题

时间复杂度🕖:O(n2)

class Solution {
    public ListNode swapPairs(ListNode head) {
        if(head==null || head.next==null) return head;
        // 1.把链表转为数组
        // 1.1求出链表的深度
        ListNode t = head;
        int len = 0;
        while(t != null){
            len++;
            t = t.next;
        }
        // 1.2 创建数组并赋值
        int[] arr = new int[len];
        int index = 0;
        t = head;
        while(t != null){
            arr[index++] = t.val;
            t = t.next;
        }
        // 2.交换数组(链表)中的节点
        for(int i=0;i+1<len;i+=2){
            swap(arr,i,i+1);
        }
        // 3. 把数组转为链表返回
        ListNode res =  new ListNode();
        ListNode a =  new ListNode(arr[0]);
        res.next = a;
        for(int i=1;i<len;i++){
            a.next = new ListNode(arr[i]);
            a = a.next;
        }
        return res.next;
    }
    void swap(int[] arr,int i, int j){
        arr[i] ^= arr[j];
        arr[j] ^= arr[i];
        arr[i] ^= arr[j];
    }
}

25、K个一组翻转链表

思路💡:把链表问题转为数组问题,使用双指针翻转元素

时间复杂度🕖:O(N)

class Solution {
    public ListNode reverseKGroup(ListNode head, int k) {
        // 1. 将链表转为数组
        ListNode t = head;
        int len = 0;
        while(t != null){
            len++;
            t = t.next;
        } 
        int[] nums = new int[len];
        t = head; // 重新初始化
        int index = 0;
        while(t!=null){
            nums[index++] = t.val;
            t = t.next;
        }
        // 比如3个一组,但是数组长度是5,我们只需要翻转前3个,因为剩下的凑不够一组
        int range = len/k*k;
        for(int i=0;i<range;i+=k){
            int l = i,r = i+k-1;
            while(l < r){ // 双指针翻转元素
                nums[l] ^= nums[r];
                nums[r] ^= nums[l];
                nums[l] ^= nums[r];
                l++;
                r--;
            }
        }
        ListNode res = new ListNode();
        ListNode a = new ListNode(nums[0]);
        res.next = a;
        // 把数组组合成链表
        for(int i=1;i<nums.length;i++){
            a.next = new ListNode(nums[i]);
            a = a.next;
        }
        return res.next;
    }

}

26、删除有序数组中的重复项

思路💡:快慢指针

时间复杂度🕖:O(N)

class Solution {
    public int removeDuplicates(int[] nums) {
        if(nums.length == 1) return 1;
        int l = 0,r = 0;
        while(r < nums.length){
            // 直到找到和左指针指向不同的值
            while(r<nums.length && nums[r]==nums[l])    r++;
            // 防止越界
            if(r >= nums.length) break;
            // 判断是否重复,把不重复的数据前移
            if(r - l > 1)   nums[l+1] = nums[r];
            l++;
            r++;
        }
        return l+1; // 返回去重后原数组的长度
    }
}

27、移除元素(快慢指针)

思路💡:使用两个指针,慢指针负责从索引 0 重新给数组赋值,快指针负责找非目标值

时间复杂度🕖:O(N)

class Solution {
    public int removeElement(int[] nums, int val) {
        int l = 0;
        for (int r = 0; r < nums.length; r++)
            if (nums[r] != val)
                nums[l++] = nums[r];
        return l;
    }
}

28、找出字符串中第一个匹配项的下标(字符串)

思路💡:substring 遍历

时间复杂度🕖:O(n * m),其中 n 是 haystack 的长度,m 是neddle 的长度

class Solution {
    public int strStr(String haystack, String needle) {
        for(int i=0;i<=haystack.length()-needle.length();i++){
            if(haystack.substring(i,i+needle.length()).equals(needle)){
                    return i;
            }
        }
        return -1;
    }
}

30、串联所有单词的子串

思路💡:使用回溯法得到数组元素的全排列,然后遍历字符串的子串查看是否能够匹配

时间复杂度🕖:

class Solution {
    boolean[] visits;
    HashSet<Integer> set = new HashSet<>(); // 因为数组中可能包含重复,所以全排列中可能有重复值
    List<Integer> ans;
    List<List<String>> tracks = new ArrayList<List<String>>();
    public List<Integer> findSubstring(String s, String[] words) {
        visits = new boolean[words.length];
        LinkedList<String> track = new LinkedList<>();
        backtrack(track,words);
        for (List<String> list : tracks) {
			StringBuilder sb = new StringBuilder();
			for(String word : list) {
				sb.append(word);
			}
			check(s,sb.toString());
		}
        ans = new ArrayList<Integer>(set);
        return ans;
    }
    public void check(String s,String ch) {
		for(int i=0;i<s.length();i++) {
			if(i+ch.length()<=s.length() && ch.charAt(0) == s.charAt(i) && s.substring(i,i+ch.length()).equals(ch)) {
				set.add(i);
			}
		}
	}
    public void backtrack(LinkedList<String> track,String[] words) {
		if(track.size()==words.length) {
			LinkedList<String> res = new LinkedList<>(track);
			tracks.add(res);
			return;
		}
		for (int i = 0; i < words.length; i++) {
			// if(track.contains(words[i])) continue; // 这里不能这么用,因为包含重复元素
			if(visits[i]) continue;
			track.add(words[i]);
			visits[i] = true;
			backtrack(track, words);
			track.removeLast();
			visits[i] = false;
		}
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/775161.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

matlab 绘制高等数学中的二维函数示例

matlab 绘制高等数学中的二维函数示例 绘制高等数学中的二维函数示例绘制结果 绘制高等数学中的二维函数示例 clc,clear,close all; % 定义方程 eqn (x, y) (x.^2 y.^2).^3 - y.^4;% 绘制方程曲线和坐标轴 ezplot(eqn, [-2, 2, -2, 2]) hold on % 在同一图形中保持绘图% 绘…

国际上备考所有云计算/IT证书的五大优质免费课程网站

最近越来越多的小伙伴来问小李哥&#xff0c;小李哥亚马逊云科技AWS认证大满贯是在哪里上课复习的呢&#xff1f;全部上付费课程那不是一笔巨款吗&#xff1f;小李哥这次来盘点备考国际上IT证书的5大优质免费课程网站(不只是亚马逊云科技AWS的课程&#xff0c;其他课程同样可以…

满足GMSL静电防护要求的方案

什么是GMSL&#xff1f;它是做什么用的&#xff1f;它有什么优点&#xff1f;设计GMSL防静电有啥难度&#xff1f; 带着这些疑问我们先了解下什么是GMSL。 一&#xff0e;简述 GMSL GMSL&#xff08;Gigabit Multimedia Serial Link&#xff09;即千兆多媒体串行链路&#xf…

odoo 物联网 设备数据采集方案

图一 架构手稿(许老师专属) 图二 架构简图 部署 方案一&#xff1a; odoo业务数据库与设备采集数据库使用一个instance。 缺点&#xff1a;重启pg服务相互影响。 方案二&#xff1a; odoo业务数据库与设备采集数据库独立部署&#xff0c;使用两个instance。 优点&#xff1a;…

一个使用率超高的大数据实验室是如何练成的?

厦门大学嘉庚学院“大数据应用实训中心”&#xff08;以下简称“实训中心”&#xff09;自2022年建成以来&#xff0c;已经成为支撑“大数据专业”复合型人才培养的重要支撑&#xff0c;目前实训中心在专业课程实验教学、项目实训、数据分析类双创比赛、毕业设计等方面都有深入…

CVPR2024自动驾驶轨迹预测方向的论文整理

2024年自动驾驶轨迹预测方向的论文汇总 1、Producing and Leveraging Online Map Uncertainty in Trajectory Prediction 论文地址&#xff1a;https://arxiv.org/pdf/2403.16439 提出针对在线地图不确定性带给轨迹预测的影响对应的解决方案。 在轨迹预测中&#xff0c;利用在…

vscode连接SSH——连接学校服务器,使用conda配置个人环境并使用

服务器的连接 在vscode远程资源管理中配置配置文件&#xff0c;如下图&#xff1a; 然后点击左下角进行连接&#xff1a; 点击需要连接的服务器&#xff0c;输入对应密码即可登录成功。 服务器上创建自己的环境 确保服务器上已安装anaconda。 先查看服务器上的conda信息&…

Linux_共享内存通信

目录 1、共享内存原理 2、申请共享内存 2.1 ftok 2.2 测试shmget、ftok 2.3 查看系统下的共享内存 3、关联共享内存 3.1 测试shmat 4、释放共享内存 4.1 测试shmctl 5、实现共享内存通信 6、共享内存的特性 结语 前言&#xff1a; 在Linux下&#xff0c;有一…

jenkins在使用pipeline时,为何没有方块形视图

项目场景&#xff1a; 安装完Jenkins时后&#xff0c;通过pipeline创建的项目任务。 问题描述 在立即构建后&#xff0c;没有显示每个阶段的视图。 原因分析&#xff1a; 原因是&#xff0c;刚安装的Jenkins&#xff0c;这个视图不是Jenkins自带的功能&#xff0c;而必须安装…

Cannot resolve symbol ‘log`

idea里的代码log变红色&#xff0c;是因为缺少Lombok插件。 安装lombok插件即可。安装完应用&#xff0c;重启软件就好了。 依次点击菜单栏中的 File → Settings&#xff08;Windows/Linux&#xff09; 或 IntelliJ IDEA → Preferences&#xff08;macOS&#xff09;。在设置…

设计模式探索:单例模式

1. 什么是单例模式? 定义: 单例模式是一种创建型设计模式,它确保一个类只有一个实例,并提供一种全局访问点以访问该实例。常见的场景包括身份证号码、政府等需要唯一实例的情况。 单例模式通常用于那些需要在应用程序中仅存在一个实例的情况,例如配置管理器、线程池、数据…

ret2syscall简单总结

主要是自己的简单的学习总结。 知识点 关于系统调用如何传递参数问题&#xff0c;即系统调用约定&#xff08;syscall&#xff0c;int 80h&#xff0c;svc&#xff09;_int 80h intel汇编用法-CSDN博客 ret2syscall的做题思路&#xff08;以32位程序为例&#xff09; - ZikH…

2024年【山东省安全员A证】考试试卷及山东省安全员A证考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 山东省安全员A证考试试卷根据新山东省安全员A证考试大纲要求&#xff0c;安全生产模拟考试一点通将山东省安全员A证模拟考试试题进行汇编&#xff0c;组成一套山东省安全员A证全真模拟考试试题&#xff0c;学员可通过…

react 项目中预防xss攻击的插件 dompurify

一、安装 $ yarn add dompurify $ yarn add --dev types/dompurify 二、使用 import DOMPurify from dompurify;// 1、处理&#xff1a; DOMPurify.sanitize(htmlContent)// 2、之后放进 dangerouslySetInnerHTML dangerouslySetInnerHTML{{ __html: cleanHTML }} 如&#…

Django自动生成Swagger接口文档 —— Python

1. 前言 当接口开发完成&#xff0c;紧接着需要编写接口文档。传统的接口文档通常都是使用Word或者一些接口文档管理平台进行编写&#xff0c;但此类接口文档维护更新比较麻烦&#xff0c;每次接口有变更&#xff0c;需要手动修改接口文档。在实际的工作中&#xff0c;经常会遇…

Docker:三、安装nginx与tomcat

&#x1f341;安装常见服务 &#x1f332;安装nginx &#x1f9ca;1、搜索镜像 Ⅰ.hub docker上查询&#xff1a;https://hub.docker.com/_/nginx Ⅱ. 命令查询&#xff1a;docker search nginx &#x1f9ca;2、下载镜像 命令&#xff1a;docker pull nginx &#x1f9c…

mmfewshot 框架概述、环境搭建与测试(一)

一、mmfewshot 框架概述 少样本学习的基本流程&#xff1a; 我们将为所有小样本学习任务引入一个简单的基线&#xff0c;以进一步说明小样本学习的工作原理。最明显的流程是微调。它通常包括两个步骤&#xff1a;在大规模数据集上训练模型&#xff0c;然后在小样本数据上进行微…

Matlab进阶绘图第62期—滑珠气泡图

在之前的文章中分享了滑珠散点图的绘制方法&#xff1a; 在此基础上&#xff0c;添加尺寸参数&#xff0c;通过散点的大小表示一个额外的特征&#xff0c;便是滑珠气泡图。 由于Matlab中没有现成的函数绘制滑珠气泡图&#xff0c;因此需要大家自行解决。 本文利用自己制作的B…

【C++】 解决 C++ 语言报错:Invalid Use of Incomplete Type

文章目录 引言 在 C 编程中&#xff0c;“Invalid Use of Incomplete Type” 是一种常见错误。此错误通常在程序试图使用未完全定义的类或结构时发生。这种错误不仅会导致编译失败&#xff0c;还可能导致程序行为不可预测。本文将详细探讨无效使用不完整类型的成因、检测方法及…