1
+ class Solution (object ):
2
+ def strobogrammaticInRange (self , low , high ):
3
+ """
4
+ :type low: str
5
+ :type high: str
6
+ :rtype: int
7
+ """
8
+ if int (low ) > int (high ):
9
+ return 0
10
+ self .findStrobogrammatic (len (high ))
11
+ #在low里找
12
+ low_rec = self .record [len (low )]
13
+ #找第一个 >= low的数的下标
14
+ low_cnt = 0
15
+ for i , num in enumerate (low_rec ):
16
+ if int (num ) >= int (low ):
17
+ low_cnt = len (low_rec ) - i
18
+ break
19
+
20
+ high_rec = self .record [len (high )]
21
+ high_cnt = len (high_rec )
22
+ for i , num in enumerate (high_rec ):
23
+ if int (num ) > int (high ):
24
+ high_cnt = i
25
+ break
26
+
27
+ if len (low ) + 1 == len (high ):
28
+ return low_cnt + high_cnt
29
+ elif len (low ) == len (high ):
30
+ return low_cnt + high_cnt - len (high_rec )
31
+ else :
32
+ tmp = 0
33
+ for l in range (len (low ) + 1 , len (high )):
34
+ # print l, self.record
35
+ tmp += len (self .record [l ])
36
+ return tmp + low_cnt + high_cnt
37
+ #找第一个 > high的数的下标
38
+ # left, right = 0, len(low_rec) - 1
39
+ # while left < right:
40
+ # mid = (left + right) // 2
41
+ # if low_rec[mid] == low:
42
+ # low_cnt = len(low_rec) - mid
43
+ # elif low_rec[mid] > low:
44
+ # right = mid - 1
45
+ # elif low_rec[mid] < low:
46
+ # left = mid + 1
47
+
48
+
49
+
50
+
51
+ def findStrobogrammatic (self , n ):
52
+ """
53
+ :type n: int
54
+ :rtype: List[str]
55
+ """
56
+ self .record = dict ()
57
+ self .record [0 ] = ["0" ]
58
+ self .record [1 ] = ["0" , "1" , "8" ]
59
+ self .record [2 ] = ["11" , "69" , "88" , "96" ]
60
+ pair = ["00" , "11" , "88" , "69" , "96" ]
61
+ if n <= 2 :
62
+ return self .record [n ]
63
+ cnt = 3
64
+ while cnt <= n :
65
+ tmp = []
66
+ if (cnt - 1 ) % 2 == 0 : #如果前一个是偶数长度,那么直接在中间加长度为1的就可以
67
+ for item in self .record [cnt - 1 ]:
68
+ for num in self .record [1 ]:
69
+ tmp .append (item [:len (item )// 2 ] + num + item [len (item ) // 2 :])
70
+ else : #如果前一个是奇数长度,那么就在中间加长度为2的就可以 ,注意要额外加“00”
71
+ for item in self .record [cnt - 2 ]:
72
+ for num in pair :
73
+ tmp .append (item [:len (item )// 2 ] + num + item [len (item ) // 2 :])
74
+ self .record [cnt ] = sorted (tmp , key = lambda x : int (x ))
75
+ cnt += 1
0 commit comments