日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

6.5 学习记录

發(fā)布時(shí)間:2025/6/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 6.5 学习记录 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

安恒實(shí)習(xí)

公司項(xiàng)目學(xué)習(xí)

前端填寫表單,后端寫入的實(shí)現(xiàn)

@Requestbody的使用和底層源碼學(xué)習(xí)

簡介(官方)

指示方法參數(shù)的注釋應(yīng)綁定到Web請求的主體。請求的主體通過a HttpMessageConverter來解析方法參數(shù),具體取決于請求的內(nèi)容類型。(可選)可以通過使用注釋參數(shù)來應(yīng)用自動驗(yàn)證@Valid。

作用

@requestBody注解常用來處理content-type不是默認(rèn)的application/x-www-form-urlcoded編碼的內(nèi)容,比如說:application/json或者是application/xml等。一般情況下來說常用其來處理application/json類型。

a. content-type : multipart/form-data 這種格式使用@RequestBody處理不了。 b. content-type : application/x-www-form-urlencoded form表單形式提交的數(shù)據(jù)格式,可以使用@RequestBody,也可以使用其他注解例如@RequestParam, @ModelAttribute進(jìn)行接收。 c. content-type : 其他數(shù)據(jù)格式 必須使用@RequestBody進(jìn)行接收。復(fù)制代碼

使用

只需在方法參數(shù)中對目標(biāo)對象或變量用@RequestBody進(jìn)行注釋即可使用,注意一個(gè)方法中只能使用一次requestBody,因?yàn)閟pring會將request請求中的body都合并到一個(gè)json中,也就是說即使有多個(gè)@RequestBody注解,只能有一個(gè)對象或變量接收。 那么如果我們有多個(gè)參數(shù)需要傳怎么辦呢?新建一個(gè)包含所有參數(shù)的類,body中的參數(shù)會與類中相同名稱的變量一一對應(yīng)。

源碼實(shí)現(xiàn)

  • @RequestBody 注解則是將 HTTP 請求正文插入方法中,使用適合的 HttpMessageConverter 將請求體寫入某個(gè)對象; Spring中處理@RequestBody主要依靠的是AbstractMessageConverterMethodArgumentResolver這個(gè)類,它實(shí)現(xiàn)了HandlerMethodArgumentResolver(在另一篇文章中已經(jīng)講過).處理網(wǎng)絡(luò)請求的方法是readWithMessageConverters這個(gè)方法(只截取了部分)。

該方法首先通過獲得inputMessage中的header,然后從header中取出contenttype。 而真正將json轉(zhuǎn)換為對象的則在下面的read()方法中。首先進(jìn)行簡單的判斷,converter是否是GenericHttpMessageConverter的一個(gè)實(shí)例,用canRead方法進(jìn)行判斷是否可以轉(zhuǎn)換(后面也是一系列的判斷)。一直到下面的read方法方法,將inputMessage轉(zhuǎn)換成目標(biāo)類,然后使用afterBodyRead方法進(jìn)行格式化,轉(zhuǎn)換成目標(biāo)對象。最后會執(zhí)行我們注解了@RequestBody的對象類里的set方法,將從json轉(zhuǎn)換來的對應(yīng)變量賦值給目標(biāo)對象。

HttpMessageConverter接口定義方法,圖片來自csdn作者喵喵小姐 blog.csdn.net/qq_34500957…

拓展

Spark學(xué)習(xí) Yarn學(xué)習(xí)

每日一題

題目 51.N皇后

n 皇后問題研究的是如何將 n 個(gè)皇后放置在 n×n 的棋盤上,并且使皇后彼此之間不能相互攻擊。

上圖為 8 皇后問題的一種解法。

給定一個(gè)整數(shù) n,返回所有不同的 n 皇后問題的解決方案。

每一種解法包含一個(gè)明確的 n 皇后問題的棋子放置方案,該方案中 'Q' 和 '.' 分別代表了皇后和空位。

示例:

輸入: 4 輸出: [ [".Q..", // 解法 1 "...Q", "Q...", "..Q."],

["..Q.", // 解法 2 "Q...", "...Q", ".Q.."] ] 解釋: 4 皇后問題存在兩個(gè)不同的解法。

思路

這道題的輸出非常難受...我的思路是用一個(gè)List<int[][]>存儲結(jié)果集,"0"代表空位,輸出",","1"代表皇后,輸出Q,然后用按行遍歷List<int[][]>里的int[][],用stringbuffer拼接結(jié)果,存入List,將List存入結(jié)果集List<List>。 再來關(guān)注這道題本身,皇后問題可以說是一個(gè)經(jīng)典的回溯算法問題,要解決這個(gè)問題主要分為兩個(gè)步驟

  • 如何判斷當(dāng)前放入的皇后是否符合要求。
  • 當(dāng)不滿足條件時(shí)及時(shí)進(jìn)行回溯。 關(guān)于1,我的思路是用一個(gè)n X n的二維數(shù)組記錄當(dāng)前已存在的皇后的攻擊區(qū)域,由于是n * n的棋盤,從左下向右上的斜線,行號和列號之和一定是一個(gè)常數(shù);自左上向右下的斜線,行號和列好之差也為常數(shù),因此我們可以利用這個(gè)特點(diǎn),標(biāo)記會被攻擊到的區(qū)域。
  • 代碼

    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; 復(fù)制代碼

    } }

    復(fù)雜度分析

    • 時(shí)間復(fù)雜度:\mathcal{O}(N!)O(N!). 放置第 1 個(gè)皇后有 N 種可能的方法,放置兩個(gè)皇后的方法不超過 N (N - 2) ,放置 3 個(gè)皇后的方法不超過 N(N - 2)(N - 4) ,以此類推。總體上,時(shí)間復(fù)雜度為 \mathcal{O}(N!)O(N!) .
    • 空間復(fù)雜度:\mathcal{O}(N)O(N) . 需要保存對角線和行的信息。

    轉(zhuǎn)載于:https://juejin.im/post/5cf720ebf265da1bba58f1eb

    總結(jié)

    以上是生活随笔為你收集整理的6.5 学习记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。