LeetCode算法总结-回溯法与深度优先搜索

转载自  LeetCode算法总结-回溯法与深度优先搜索

回溯法(探索与回溯法)是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
例题一
牛客网-LeetCode148题之combinations问题
题目描述
    给出两个整数n和k,返回从1到n中取k个数字的所有可能的组合
    例如:
    如果n=4,k=2,结果为
    [↵ [2,4],↵ [3,4],↵ [2,3],↵ [1,2],↵ [1,3],↵ [1,4],↵]
    Given two integers n and k, return all possible combinations of k numbers out of 1 … n.
    For example,
    If n = 4 and k = 2, a solution is:
    [↵ [2,4],↵ [3,4],↵ [2,3],↵ [1,2],↵ [1,3],↵ [1,4],↵]↵
先附带答案-再进行讲解

import java.util.*;
public class Solution {/*** * @param n int整型 * @param k int整型 * @return int整型ArrayList<ArrayList<>>*/public ArrayList<ArrayList<Integer>> combine (int n, int k) {// write code hereArrayList<ArrayList<Integer>> lists=new ArrayList<ArrayList<Integer>>();ArrayList<Integer> list=new ArrayList<>();backTrack(n,k,1,lists,list);return lists;}public void backTrack(int n,int k,int start,ArrayList<ArrayList<Integer>> lists,ArrayList<Integer> list){if(k<0){return;}else if(k==0){lists.add(new ArrayList(list));}else{for(int i=start;i<=n;i++){list.add(i);backTrack(n,k-1,i+1,lists,list);list.remove(list.size()-1);}}}
}

    要求返回的类型是ArrayList<ArrayList< Integer >> 也就是说将所有可能的组合list(由整数构成)放入另一个list(由list构成)中。
    现在进行套路教学:要求返回List<List< Intege r>>,那我就给你一个List<List< Intege r>>,因此
    (1) 定义一个全局List<List> result=new ArrayList<List>();
    (2) 定义一个辅助的方法(函数)public void backtracking(int n,int k, Listlist){}
    n k 总是要有的吧,加上这两个参数,前面提到List 是数字的组合,也是需要的吧,这三个是必须的,没问题吧。(可以尝试性地写参数,最后不需要的删除)
    (3) 接着就是我们的重头戏了,如何实现这个算法?对于n=4,k=2,1,2,3,4中选2个数字,我们可以做如下尝试,加入先选择1,那我们只需要再选择一个数字,注意这时候k=1了(此时只需要选择1个数字啦)。当然,我们也可以先选择2,3 或者4,通俗化一点,我们可以选择(1-n)的所有数字,这个是可以用一个循环来描述?每次选择一个加入我们的链表list中,下一次只要再选择k-1个数字。那什么时候结束呢?当然是k<0的时候啦,这时候都选完了。
 

回溯法要注意回退
例题二
牛客网-LeetCode148题之combinations问题
题目描述
    给出一组候选数C和一个目标数T,找出候选数中加起来和等于T的所有组合。
    C中的数字在组合中可以被无限次使用
注意:
     题目中所有的数字(包括目标数T)都是正整数
     你给出的组合中的数字 (a 1, a 2, … , a k) 要按非递增排序 (ie, a 1 ≤ a 2 ≤ … ≤ a k).
     结解集中不能包含重复的组合
    例如:给定的候选数集是[2,3,6,7],目标数是7
解集是:
    [7]
    [2, 2, 3]

import java.util.*;
public class Solution {public ArrayList<ArrayList<Integer>> combinationSum(int[] candidates, int target) {ArrayList<ArrayList<Integer>> lists=new ArrayList<ArrayList<Integer>>();ArrayList<Integer> list=new ArrayList<>();Arrays.sort(candidates);backTrack(candidates,target,0,lists,list);return lists;}public void backTrack(int[] candidates,int target,int start,ArrayList<ArrayList<Integer>> lists,ArrayList<Integer> list){if(target<0){return;}else if(target==0){ArrayList<Integer> temp=new ArrayList(list);Collections.sort(temp);lists.add(temp);}else{for(int i=start;i<candidates.length;i++){list.add(candidates[i]);backTrack(candidates,target-candidates[i],i,lists,list);list.remove(list.size()-1);}}}
}

 

例题三
牛客网-LeetCode148题之subsets问题
题目描述
     现在有一个没有重复元素的整数集合S,求S的所有子集
注意:
     你给出的子集中的元素必须按不下降的顺序排列
     给出的解集中不能出现重复的元素
例如:
     如果S=[1,2,3], 给出的解集应为:
     [↵ [3],↵ [1],↵ [2],↵ [1,2,3],↵ [1,3],↵ [2,3],↵ [1,2],↵ []↵]
方法一:其实这种方法完全可以输出正确内容但是顺序与oj不同,不能通过,也没能找到合适的比较器策略。

import java.util.*;
public class Solution {public ArrayList<ArrayList<Integer>> subsets(int[] S) {ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();Arrays.sort(S);backtrack(list, new ArrayList<>(),S, 0);// Collections.sort(list);return list;}private void backtrack(ArrayList<ArrayList<Integer>> list , ArrayList<Integer> tempList, int [] nums, int start){list.add(new ArrayList<>(tempList));for(int i = start; i < nums.length; i++){tempList.add(nums[i]);backtrack(list, tempList, nums, i + 1);tempList.remove(tempList.size() - 1);}}
}

方法二

import java.util.*;
public class Solution {public ArrayList<ArrayList<Integer>> subsets(int[] S) {ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();ArrayList<Integer> list=new ArrayList<>();Arrays.sort(S);for(int i=0;i<=S.length;i++){backtrack(S,i,0,lists,list);}// Collections.sort(list);return lists;}//这里的K其实就是要获取多长的子序列private void backtrack(int[] S,int k,int start,ArrayList<ArrayList<Integer>> lists , ArrayList<Integer> list){if(k<0){return;}else if(k==0){ArrayList<Integer> temp=new ArrayList(list);Collections.sort(temp);lists.add(temp);}else{for(int i = start; i < S.length; i++){list.add(S[i]);backtrack(S,k-1,i+1,lists,list);list.remove(list.size()-1);}}}
}

例题四
牛客网-LeetCode148题之subsets进阶问题
题目描述
    给出一个可能包含重复元素的整数集合S,返回该整数集合的所有子集。
注意:
     你给出的子集中的元素要按非递减的顺序排列
     给出的解集中不能包含重复的子集
例如:
    如果S =[1,2,2], 给出的解集应该是:
[↵ [2],↵ [1],↵ [1,2,2],↵ [2,2],↵ [1,2],↵ []↵]

import java.util.ArrayList;
import java.util.ArrayList;
import java.util.Arrays;public class Solution {public ArrayList<ArrayList<Integer>> subsetsWithDup(int[] num) {ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();ArrayList<Integer> list=new ArrayList<>();if(num.length == 0){return lists;}Arrays.sort(num);backTrack(num,0,lists,list);return lists;}private void backTrack(int[] num, int start,ArrayList<ArrayList<Integer>> lists, ArrayList<Integer> list) {lists.add(new ArrayList<>(list));for(int i = start ; i < num.length ; i++){if( i != start && num[i] == num[i-1]){continue;}list.add(num[i]);backTrack(num,i+1,lists,list);list.remove(list.size()-1);}}
}

例题五
牛客网-LeetCode148题之permutations问题
题目描述
    给出一组数字,返回该组数字的所有排列
    例如:
    [1,2,3]的所有排列如下
    [1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], [3,2,1].

import java.util.*;
public class Solution {public ArrayList<ArrayList<Integer>> permute(int[] num) {ArrayList<ArrayList<Integer>> lists = new ArrayList<>();// Arrays.sort(nums); // not necessaryArrayList<Integer> list=new ArrayList<>();backtrack(lists,list, num,0);return lists;}private void backtrack(ArrayList<ArrayList<Integer>> lists, ArrayList<Integer> list, int [] nums,int k){if(k== nums.length){lists.add(new ArrayList<>(list));return;} else{for(int i = 0; i < nums.length; i++){ if(list.contains(nums[i])) continue; // element already exists, skiplist.add(nums[i]);backtrack(lists, list, nums,k+1);list.remove(list.size() - 1);}}}
}

例题六
牛客网-LeetCode148题之permutations进阶问题
给出一组可能包含重复项的数字,返回该组数字的所有排列
例如;
[1,1,2]的排列如下:
[1,1,2],[1,2,1], [2,1,1].

import java.util.*;
public class Solution {public ArrayList<ArrayList<Integer>> permuteUnique(int[] num) {ArrayList<ArrayList<Integer>> list = new ArrayList<>();Arrays.sort(num);backtrack(list, new ArrayList<>(), num, new boolean[num.length]);return list;}private void backtrack(ArrayList<ArrayList<Integer>> lists, ArrayList<Integer> list, int [] nums, boolean [] used){if(list.size() == nums.length){lists.add(new ArrayList<>(list));} else{for(int i = 0; i < nums.length; i++){if(used[i] || i > 0 && nums[i] == nums[i-1] && !used[i - 1]) continue;used[i] = true; list.add(nums[i]);backtrack(lists, list, nums, used);used[i] = false; list.remove(list.size() - 1);}}}
}

 

例题七
牛客网-LeetCode148题之letter-combination-of-phone问题
    给出一个仅包含数字的字符串,给出所有可能的字母组合。
    数字到字母的映射方式如下:(就像电话上数字和字母的映射一样)
                   

  在这里插入图片描述

import java.util.*;
public class Solution {/*** * @param digits string字符串 * @return string字符串ArrayList*/public ArrayList<String> letterCombinations (String digits) {// write code hereArrayList<String> list=new ArrayList<>();String[] str={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};StringBuilder res=new StringBuilder();backTrack(digits,str,res,0,list);return list;}//k表示的是到了第几个数字public void backTrack(String digits,String[] strs,StringBuilder sb,int k,ArrayList<String> list){if(k==digits.length()){String s=sb.toString();list.add(s);return;}for(int i=0;i<strs[digits.charAt(k)-'0'].length();i++){sb.append(strs[digits.charAt(k)-'0'].charAt(i));backTrack(digits,strs,sb,k+1,list);sb.delete(sb.length()-1,sb.length());}}
}

https://www.nowcoder.com/practice/f0069cfcd42649e3b6b0c759fae8cde6?tpId=46&tags=&title=&diffculty=0&judgeStatus=0&rp=1&ru=/ta/leetcode&qru=/ta/leetcode/question-ranking

剑指 Offer 12. 矩阵中的路径
    请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。
[[“a”,“b”,“c”,“e”],
[“s”,“f”,“c”,“s”],
[“a”,“d”,“e”,“e”]]
    但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入这个格子。
示例 1:
    输入:board = [[“A”,“B”,“C”,“E”],[“S”,“F”,“C”,“S”],[“A”,“D”,“E”,“E”]], word = “ABCCED”
    输出:true
示例 2
    输入:board = [[“a”,“b”],[“c”,“d”]], word = “abcd”
    输出:false

class Solution {public boolean exist(char[][] board, String word) {char[] words = word.toCharArray();boolean[][] flag=new boolean[board.length][board[0].length];for(int i = 0; i < board.length; i++) {for(int j = 0; j < board[0].length; j++) {if(dfs(board, words, flag,i, j, 0)) return true;}}return false;}boolean dfs(char[][] board, char[] word,boolean[][] flag, int i, int j, int k) {if(i >= board.length || i < 0 || j >= board[0].length || j < 0 || board[i][j] != word[k]||flag[i][j]) return false;if(k == word.length - 1) return true;// char tmp = board[i][j];//board[i][j] = '/';flag[i][j]=true;boolean res = dfs(board, word,flag, i + 1, j, k + 1) || dfs(board, word,flag, i - 1, j, k + 1) || dfs(board, word,flag, i, j + 1, k + 1) || dfs(board, word,flag, i , j - 1, k + 1);// board[i][j] = tmp;flag[i][j]=false;return res;}
}

题目描述:(这题其实不是回溯法 但是跟上道题很像)
    地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?

public class Solution {public int movingCount(int threshold, int rows, int cols){boolean move[][] = new boolean[rows][cols];return help(0,0,threshold,rows,cols,move);}public int help(int i, int j, int threshold, int rows, int cols, boolean[][] move){if(i<0||j<0||i>=rows||j>=cols||bitNum(i)+bitNum(j)>threshold||move[i][j] == true)return 0;move[i][j] = true;return help(i-1,j,threshold,rows,cols,move)+help(i+1,j,threshold,rows,cols,move)+help(i,j-1,threshold,rows,cols,move)+help(i,j+1,threshold,rows,cols,move)+1;}public int bitNum(int i){int sum = 0;do{sum += i%10;}while((i = i/10) > 0);return sum;}
}

LeetCode 200. 岛屿数量
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。

class Solution {void dfs(char[][] grid, int r, int c) {int nr = grid.length;int nc = grid[0].length;if (r < 0 || c < 0 || r >= nr || c >= nc || grid[r][c] == '0') {return;}grid[r][c] = '0';dfs(grid, r - 1, c);dfs(grid, r + 1, c);dfs(grid, r, c - 1);dfs(grid, r, c + 1);}public int numIslands(char[][] grid) {if (grid == null || grid.length == 0) {return 0;}int nr = grid.length;int nc = grid[0].length;int num_islands = 0;for (int r = 0; r < nr; ++r) {for (int c = 0; c < nc; ++c) {if (grid[r][c] == '1') {++num_islands;dfs(grid, r, c);}}}return num_islands;}
}

矩阵中的单词匹配
单词匹配
题目描述
给出一个二维字符数组和一个单词,判断单词是否在数组中出现,
单词由相邻单元格的字母连接而成,相邻单元指的是上下左右相邻。同一单元格的字母不能多次使用。
例如:
给出的字符数组=
[↵ [“ABCE”],↵ [“SFCS”],↵ [“ADEE”]↵]
单词 =“ABCCED”, -> 返回 true,
单词 =“SEE”, ->返回 true,
单词 =“ABCB”, -> 返回 false.

public class Solution {public boolean exist(char[][] board, String word){if(word == null || word == "" || board == null || board.length == 0){return false;}int wordLengh = word.length();int row = board.length ;int colum = board[0].length;int flag[][]= new int[row][colum];for(int i = 0 ; i < row ; i ++){for(int j = 0; j < colum ; j ++){if(dfs(i,j,row,colum,word,board,flag,0)){return true;}}}return false;}public boolean dfs(int i ,int j ,int rowMax,int columMax,String word,char[][] board,int flag[][],int count){if(i >= rowMax || j >= columMax || i < 0 || j < 0 || flag[i][j] == 1 || word.charAt(count) != board[i][j]){return false;}flag[i][j] = 1;if(count == word.length() -1 ){return true;}if( dfs(i + 1, j,rowMax,columMax,word,board,flag,count+1) ||dfs(i - 1, j,rowMax,columMax,word,board,flag,count+1)|| dfs(i , j + 1,rowMax,columMax,word,board,flag,count+1) ||dfs(i , j -1,rowMax,columMax,word,board,flag,count+1)){return true;}flag[i][j] = 0;return false;}
}

LeetCode679. 24 点游戏
24点
你有 4 张写有 1 到 9 数字的牌。你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24。

示例 1:

输入: [4, 1, 8, 7]
输出: True
解释: (8-4) * (7-1) = 24
示例 2:

输入: [1, 2, 1, 2]
输出: False
注意:

除法运算符 / 表示实数除法,而不是整数除法。例如 4 / (1 - 2/3) = 12 。
每个运算符对两个数进行运算。特别是我们不能用 - 作为一元运算符。例如,[1, 1, 1, 1] 作为输入时,表达式 -1 - 1 - 1 - 1 是不允许的。
你不能将数字连接在一起。例如,输入为 [1, 2, 1, 2] 时,不能写成 12 + 12 。

import java.util.*;public class Solution {public boolean judgePoint24(int[] nums) {List<Double> numbers = new ArrayList<Double>();for (int num : nums) {numbers.add((double) num);}return solve(numbers);}/*** @description 回溯法,从数组中选出两个数,把运算结果加到数组中*/private boolean solve(List<Double> numbers) {if (numbers.size() == 1) {//数组中只剩下一个数的时候判断结果return Math.abs(numbers.get(0) - 24) < 1e-6;//看是否与24相等}//从numbers中取出两个数,把结果放入数组中for (int i = 0; i < numbers.size(); i++) {for (int j = 0; j < numbers.size(); j++) {if (i != j) {//取不同的两个数//如果回溯的话,还要恢复现场,把数插回原位置,所以不如直接生成一个新数组List<Double> nums = new ArrayList<Double>();for (int k = 0; k < numbers.size(); k++) {if (k != i && k != j) {//把剩下的数加入到新数组nums.add(numbers.get(k));}}Set<Double> doubles = calculate(numbers.get(i), numbers.get(j));//获取两个数运算的结果集for (Double aDouble : doubles) {nums.add(aDouble);//把两个数运算的结果,分别加入到新数组中if (solve(nums)) {//找到一个结果,立即返回return true;}nums.remove(nums.size() - 1);//恢复现场}}}}return false;//如果没有找到结果,返回false}/*** @description 返回两个数计算得到的结果集*/private Set<Double> calculate(double a, double b) {Set<Double> res = new HashSet<Double>();res.add(a - b);res.add(b - a);res.add(a + b);res.add(a * b);if (a != 0) {res.add(b / a);}if (b != 0) {res.add(a / b);}return res;}
}

95. 不同的二叉搜索树 II
给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。

class Solution {public List<TreeNode> generateTrees(int n) {if (n == 0) {return new LinkedList<TreeNode>();}return generateTrees(1, n);}public List<TreeNode> generateTrees(int start, int end) {List<TreeNode> allTrees = new LinkedList<TreeNode>();if (start > end) {allTrees.add(null);return allTrees;}// 枚举可行根节点for (int i = start; i <= end; i++) {// 获得所有可行的左子树集合List<TreeNode> leftTrees = generateTrees(start, i - 1);// 获得所有可行的右子树集合List<TreeNode> rightTrees = generateTrees(i + 1, end);// 从左子树集合中选出一棵左子树,从右子树集合中选出一棵右子树,拼接到根节点上for (TreeNode left : leftTrees) {for (TreeNode right : rightTrees) {TreeNode currTree = new TreeNode(i);currTree.left = left;currTree.right = right;allTrees.add(currTree);}}}return allTrees;}
}
class Solution {public int numTrees(int n) {if(n<=2)return n;//防止溢出long cn=1;//卡特兰数for(int i=0;i<n;i++){cn=cn*2*(2*i+1)/(i+2);}return (int)cn;}
}

马走日,判断能否从一个点到另一个点,并返回路径感觉这个问题应该也是回溯法,但是没有OJ平台可以测试。

leetcode 130. 被围绕的区域

https://www.nowcoder.com/practice/185a87cd29eb42049132aed873273e83?tpId=46&tags=&title=&diffculty=0&judgeStatus=0&rp=1https://www.nowcoder.com/practice/185a87cd29eb42049132aed873273e83?tpId=46&tags=&title=&diffculty=0&judgeStatus=0&rp=1

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

入门干货之用DVG打造你的项目主页-Docfx、Vs、Github

由于这三项技术涉及到的要点以及内容较多&#xff0c;希望大家有空能自己挖掘一下更多更深的用法。0x01、介绍VS&#xff0c;即VS2017以及以上版本&#xff0c;宇宙最好的IDE&#xff0c;集成了宇宙最有前景的平台&#xff0c;前阶段也支持了宇宙最好的语言。Github&#xff0c…

ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器)

前言本文主要是详解一下在ASP.NET Core中,自带的IOC容器相关的使用方式和注入类型的生命周期.这里就不详细的赘述IOC是什么 以及DI是什么了.. emm..不懂的可以自行百度.正文今天我们主要讲讲如何使用自带IOC容器,emm..虽然自带的功能不是那么强大,但是胜在轻量级..而且..不用引…

P4130,jzoj1214-[NOI2007]项链工厂【线段树】

正题 题目链接:https://www.luogu.org/problemnew/show/P4130 题目大意 一个环形颜色珠子链&#xff0c;位置(注意不是上面的珠子)从最上顺时针下来位置依次标号1∼n1\sim n1∼n。 然后要求支持以下操作 Rk:R\ k:R k:将所有珠子顺时针旋转kkk个。F:F:F:将所有珠子以111向下翻…

LeetCode常用算法模式大厂面试题整理

转载自 LeetCode常用算法模式&大厂面试题整理 文章目录 1、滑动窗口 2、双指针 3、快慢指针 4、合并区间 5、循环排序 6、就地反转链表 7、堆-优先队列问题 8、Top K 9、归并 10、单调栈 11、回溯法 BATJ等大厂面试真题汇总 1、滑动窗口 1 一个左指针&#xff0c;一个右…

ABPZero系列教程之拼多多卖家工具

此系列文章围绕着拼多多卖家工具来介绍ABPZero的使用&#xff0c;内容包括手机登录、手机注册、拼团提醒、微信公众号绑定帐号、有拼团发送消息到微信公众号&#xff08;只要关注过微信公众号并已绑定系统帐号&#xff09;。学习此系列必备&#xff1a;手机验证码&#xff1a;使…

g4e基础篇#4 了解Git存储库(Repo)

Git 存储库看上去就是一个文件夹&#xff0c;只是在这个文件夹中不仅仅保存了所有文件的当前版本&#xff0c;也同时保存了所有的历史记录&#xff0c;这些额外的信息都保存在当前文件夹下面的.git子目录中。因为前面我们所描述的git跟踪改动的特殊方式 &#xff0c;git可以在很…

net的retrofit--WebApiClient库

# 库简介WebApiClient是开源在github上的一个httpClient客户端库&#xff0c;内部基于HttpClient开发&#xff0c;是一个只需要定义c#接口(interface)&#xff0c;并打上相关特性&#xff0c;即可异步调用http-api的框架 &#xff0c;支持.net framework4.5、netcoreapp2.0和ne…

Sentinel(一)之简介

转载自 Sentinel: 分布式系统的流量防卫兵 Sentinel 是什么&#xff1f; 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件&#xff0c;主要以流量为切入点&#xff0c;从限流、流量整形、熔断降级、系统负…

使用xUnit为.net core程序进行单元测试(中)

第一部分: 使用xUnit为.net core程序进行单元测试(上), 下面有一点点内容是重叠的....String Assert测试string是否相等&#xff1a;[Fact]public void CalculateFullName(){var p new Patient{FirstName "Nick",LastName "Carter"};Assert.Equal(&quo…

Sentinel(二)之Quick Start

转载自 Sentinel Quick Start 1.1 公网 Demo 如果希望最快的了解 Sentinel 在做什么&#xff0c;我们可以通过 Sentinel 新手指南 来运行一个例子&#xff0c;并且能在云上控制台上看到最直观的监控和流控效果等。 1.2 手动接入 Sentinel 以及控制台 下面的例子将展示应用如…

.net的retrofit--WebApiClient库深入篇

前言本篇文章的内容是对上一篇.net的retrofit--WebApiClient库的深层次补充&#xff0c;你可能需要先阅读上一篇才能理解此篇文章。本文将详细地讲解WebApiClient的原理&#xff0c;结合实际项目中可能遇到的问题进行使用说明。库简介WebApiClient是开源在github上的一个httpCl…

Sentinel(三)之如何使用

转载自 Sentinel如何使用 简介 Sentinel 可以简单的分为 Sentinel 核心库和 Dashboard。核心库不依赖 Dashboard&#xff0c;但是结合 Dashboard 可以取得最好的效果。 这篇文章主要介绍 Sentinel 核心库的使用。如果希望有一个最快最直接的了解&#xff0c;可以参考 新手指…

ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)

上一篇ASP.NET Core中使用IOC三部曲(一.使用ASP.NET Core自带的IOC容器) ,我们说过ASP.NET Core中自带的IOC容器是属于轻量级的,功能并不是很多,只是提供了基础功能而已..所以今天我们主要讲讲如何采用Autofac来替换IOC容器,并实现属性注入注意:本文需要读者理解DI IOC并使用过…

Sentinel(四)之工作主流程

转载自 工作主流程 Overview 在 Sentinel 里面&#xff0c;所有的资源都对应一个资源名称&#xff08;resourceName&#xff09;&#xff0c;每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架的适配自动创建&#xff0c;也可以通过注解的方式或调用 SphU API…

在 .NET Core 中的并发编程

原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core今天我们购买的每台电脑都有一个多核心的 CPU&#xff0c;允许它并行执行多个指令。操作系统通过将进程调度到不同的内核来发挥这个结构的优点。然而&#xff0c;还可以通过异步 I/O 操作和…

Sentinel(五)之流量控制

转载自 流量控制 概述 流量控制&#xff08;flow control&#xff09;&#xff0c;其原理是监控应用流量的 QPS 或并发线程数等指标&#xff0c;当达到指定的阈值时对流量进行控制&#xff0c;以避免被瞬时的流量高峰冲垮&#xff0c;从而保障应用的高可用性。 FlowSlot 会…

ASP.NET Core中使用IOC三部曲(三.采用替换后的Autofac来实现AOP拦截)

上一篇ASP.NET Core中使用IOC三部曲(二.采用Autofac来替换IOC容器,并实现属性注入)我们讲了如何将默认的容器替换为Autofac,并使用属性注入.那么这一篇我们就来讲讲如何利用Autofac实现我们的AOP(面向切面编程) .1.引用正确的库来实现AOP既然是跨平台,那么在asp.net core因为采…

Sentinel(六)之集群流控

转载自 集群流控 介绍 为什么要使用集群流控呢&#xff1f;假设我们希望给某个用户限制调用某个 API 的总 QPS 为 50&#xff0c;但机器数可能很多&#xff08;比如有 100 台&#xff09;。这时候我们很自然地就想到&#xff0c;找一个 server 来专门来统计总的调用量&#…

Mybatis-Plus基本

Data AllArgsConstructor//全参构造 NoArgsConstructor//无参构造 Accessors(chain true)//链表模式 TableName("User")//映射数据表名 public class User implements Serializable {//序列化传输保证数据完整TableId(type IdType.UUID)//设定主键自增private Inte…