Day4 | 拒絕采樣 正則表達(dá)式
470 用rand7()實(shí)現(xiàn)rand10()
我們可以用拒絕采樣的方法實(shí)現(xiàn) Rand10()。在拒絕采樣中,如果生成的隨機(jī)數(shù)滿足要求,那么就返回該隨機(jī)數(shù),否則會(huì)不斷生成,直到生成一個(gè)滿足要求的隨機(jī)數(shù)為止。
我們只需要能夠滿足等概率的生成 1010 個(gè)不同的數(shù)即可,具體的生成方法可以有很多種,比如我們可以利用兩個(gè)Rand7() 相乘,我們只取其中等概率的 10個(gè)不同的數(shù)的組合即可,當(dāng)然還有許多其他不同的解法,可以利用各種運(yùn)算和函數(shù)的組合等方式來(lái)實(shí)現(xiàn)。?
class Solution extends SolBase {
? ? public int rand10() {
? ? ? ? int row, col, idx;
? ? ? ? do {
? ? ? ? ? ? row = rand7();
? ? ? ? ? ? col = rand7();
? ? ? ? ? ? idx = col + (row - 1) * 7; //減1 是為了只生成1~40的數(shù)
? ? ? ? } while (idx > 40);
? ? ? ? return 1 + (idx - 1) % 10;
? ? }
}
正則表達(dá)式總結(jié)
基本元素
1. 普通字符:?除 *, ? , \, (, ), [, ], -, . , +, ^, $, {, } , 以外的字符匹配它自身, 比如 a 匹配 a
2. 點(diǎn)號(hào) . :?匹配任意不包括換行符的單個(gè)字符。比如, sa. 可匹配 sat, sa*, sa[ 等。
3. 字符組[characters] :匹配字符組中指定字符集合中的任意單個(gè)字符: 比如 [abc] 將匹配 a 或 b 或 c , ca[ptb] 將匹配 cap, cat 或 cab。
4. 排除性字符組[^characters] :?匹配字符組中指定字符集合之外的任意單個(gè)字符:
比如, [^abc] 將匹配除了 a,b,c 之外的任意單個(gè)字符。
ca[^ptb],將匹配 caX 的文本,除了 cap, cat, cab, 注意,這里是匹配一個(gè)非指定的字符,而不是不匹配。
5. 范圍字符組:?[char1-char2] 將匹配從char1 到 char2 之間的任意單個(gè)字符(按照ASCII編碼)。
比如, [a-z] 匹配任意小寫字符; [A-Z] 匹配任意大寫字符 ; [0-9] 匹配任意數(shù)字; [a-zA-Z0-9] 匹配任意大小寫字符或數(shù)字。
6. 特殊字符:?凡是在正則式中具有特殊含義的字符,要匹配字符本身(將其作為普通文本)都必須使用反斜線 \ 進(jìn)行轉(zhuǎn)義;通常需要轉(zhuǎn)義的字符有: . + * ? { } [ ] ( ) - \ ^ $。
比如, 匹配 . 的正則式是 \. , 匹配 \ 的正則式是 \\ , 匹配 ( 的正則式是 \( ;要匹配 (ab) 的正則表達(dá)式是 \(ab\) ; 要匹配 a? 的表達(dá)式是 a\? ; a? 將匹配空或單個(gè)a。
7. 匹配空白字符:
\f 換頁(yè) \n 換行 \r 回車 \t 制表符 \v 垂直制表符 \s 匹配任意空白符,包括上述任意一種
8. 字符類:?<==> 等價(jià)于
\d <==> [0-9] 任意單個(gè)數(shù)字 \D <==> [^0-9] 任意單個(gè)的非數(shù)字字符
\w <==> [a-zA-Z0-9_] \W <==> [^a-zA-Z0-9_]
\s <==> [\f\n\r\t\v ] \S <==> [^\f\n\r\t\v ]
9. POSIX 字符類:?例如: [:digit:] <==> [0-9] ; [:alpha:] <==> [a-zA-Z] ; [:alnum:] <==> [a-zA-Z0-9]
具體應(yīng)用時(shí)要再加一層括號(hào),比如 TEST[[:digit:]] 匹配 TEST0 - TEST9。