6.5 学习记录
安恒實習
公司項目學習
前端填寫表單,后端寫入的實現
@Requestbody的使用和底層源碼學習
簡介(官方)
指示方法參數的注釋應綁定到Web請求的主體。請求的主體通過a HttpMessageConverter來解析方法參數,具體取決于請求的內容類型。(可選)可以通過使用注釋參數來應用自動驗證@Valid。
作用
@requestBody注解常用來處理content-type不是默認的application/x-www-form-urlcoded編碼的內容,比如說:application/json或者是application/xml等。一般情況下來說常用其來處理application/json類型。
a. content-type : multipart/form-data 這種格式使用@RequestBody處理不了。 b. content-type : application/x-www-form-urlencoded form表單形式提交的數據格式,可以使用@RequestBody,也可以使用其他注解例如@RequestParam, @ModelAttribute進行接收。 c. content-type : 其他數據格式 必須使用@RequestBody進行接收。復制代碼使用
只需在方法參數中對目標對象或變量用@RequestBody進行注釋即可使用,注意一個方法中只能使用一次requestBody,因為spring會將request請求中的body都合并到一個json中,也就是說即使有多個@RequestBody注解,只能有一個對象或變量接收。 那么如果我們有多個參數需要傳怎么辦呢?新建一個包含所有參數的類,body中的參數會與類中相同名稱的變量一一對應。
源碼實現
- @RequestBody 注解則是將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個對象; Spring中處理@RequestBody主要依靠的是AbstractMessageConverterMethodArgumentResolver這個類,它實現了HandlerMethodArgumentResolver(在另一篇文章中已經講過).處理網絡請求的方法是readWithMessageConverters這個方法(只截取了部分)。
HttpMessageConverter接口定義方法,圖片來自csdn作者喵喵小姐 blog.csdn.net/qq_34500957…
拓展
Spark學習 Yarn學習
每日一題
題目 51.N皇后
n 皇后問題研究的是如何將 n 個皇后放置在 n×n 的棋盤上,并且使皇后彼此之間不能相互攻擊。
上圖為 8 皇后問題的一種解法。給定一個整數 n,返回所有不同的 n 皇后問題的解決方案。
每一種解法包含一個明確的 n 皇后問題的棋子放置方案,該方案中 'Q' 和 '.' 分別代表了皇后和空位。
示例:
輸入: 4 輸出: [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."],
["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ] 解釋: 4 皇后問題存在兩個不同的解法。
思路
這道題的輸出非常難受...我的思路是用一個List<int[][]>存儲結果集,"0"代表空位,輸出",","1"代表皇后,輸出Q,然后用按行遍歷List<int[][]>里的int[][],用stringbuffer拼接結果,存入List,將List存入結果集List<List>。 再來關注這道題本身,皇后問題可以說是一個經典的回溯算法問題,要解決這個問題主要分為兩個步驟
代碼
class Solution { int rows[]; // "hill" diagonals int hills[]; // "dale" diagonals int dales[]; int n; // output List<List> output = new ArrayList(); // queens positions int queens[];
public boolean isNotUnderAttack(int row, int col) { int res = rows[col] + hills[row - col + 2 * n] + dales[row + col]; return (res == 0) ? true : false; }
public void placeQueen(int row, int col) { queens[row] = col; rows[col] = 1; hills[row - col + 2 * n] = 1; // "hill" diagonals dales[row + col] = 1; //"dale" diagonals }
public void removeQueen(int row, int col) { queens[row] = 0; rows[col] = 0; hills[row - col + 2 * n] = 0; dales[row + col] = 0; }
public void addSolution() { List solution = new ArrayList(); for (int i = 0; i < n; ++i) { int col = queens[i]; StringBuilder sb = new StringBuilder(); for(int j = 0; j < col; ++j) sb.append("."); sb.append("Q"); for(int j = 0; j < n - col - 1; ++j) sb.append("."); solution.add(sb.toString()); } output.add(solution); }
public void backtrack(int row) { for (int col = 0; col < n; col++) { if (isNotUnderAttack(row, col)) { placeQueen(row, col); // if n queens are already placed if (row + 1 == n) addSolution(); // if not proceed to place the rest else backtrack(row + 1); // backtrack removeQueen(row, col); } } }
public List<List> solveNQueens(int n) { this.n = n; rows = new int[n]; hills = new int[4 * n - 1]; dales = new int[2 * n - 1]; queens = new int[n];
backtrack(0); return output; 復制代碼} }
復雜度分析
- 時間復雜度:\mathcal{O}(N!)O(N!). 放置第 1 個皇后有 N 種可能的方法,放置兩個皇后的方法不超過 N (N - 2) ,放置 3 個皇后的方法不超過 N(N - 2)(N - 4) ,以此類推。總體上,時間復雜度為 \mathcal{O}(N!)O(N!) .
- 空間復雜度:\mathcal{O}(N)O(N) . 需要保存對角線和行的信息。
轉載于:https://juejin.im/post/5cf720ebf265da1bba58f1eb
總結
- 上一篇: 数据为什么要可视化?如何可视化?
- 下一篇: Logtail提升采集性能