788. 旋轉(zhuǎn)數(shù)字
我們稱一個數(shù) X 為好數(shù), 如果它的每位數(shù)字逐個地被旋轉(zhuǎn) 180 度后,我們?nèi)钥梢缘玫揭粋€有效的适袜,且和 X 不同的數(shù)柄错。要求每位數(shù)字都要被旋轉(zhuǎn)。
如果一個數(shù)的每位數(shù)字被旋轉(zhuǎn)以后仍然還是一個數(shù)字, 則這個數(shù)是有效的售貌。
- 0, 1, 和 8 被旋轉(zhuǎn)后仍然是它們自己给猾;
- 2 和 5 可以互相旋轉(zhuǎn)成對方(在這種情況下,它們以不同的方向旋轉(zhuǎn)颂跨,換句話說敢伸,2 和 5 互為鏡像);6 和 9 同理毫捣,
- 除了這些以外其他的數(shù)字旋轉(zhuǎn)以后都不再是有效的數(shù)字详拙。
現(xiàn)在我們有一個正整數(shù) N, 計算從 1 到 N 中有多少個數(shù) X 是好數(shù)?
輸入: 10
輸出: 4
解釋:
在[1, 10]中有四個好數(shù): 2, 5, 6, 9蔓同。
注意 1 和 10 不是好數(shù), 因為他們在旋轉(zhuǎn)之后不變饶辙。
- 方法1:枚舉按條件變換之后進行判斷
class Solution:
def rotatedDigits(self, n: int) -> int:
res = 0
for num in range(1, n+1):
s = list(str(num))
# print(s1, s2)
# 先要保證每個數(shù)字可以旋轉(zhuǎn)
if ('3' not in s) and ('4' not in s) and ('7' not in s):
# 進行旋轉(zhuǎn)操作后判斷是否不同
for i in range(len(s)):
if s[i] == '2':
s[i] = '5'
elif s[i] == '5':
s[i] = '2'
elif s[i] == '6':
s[i] = '9'
elif s[i] == '9':
s[i] = '6'
if int(''.join(s)) != num:
# print(num)
res += 1
return res
- 方法2:枚舉之后進行標(biāo)記
給定數(shù)字的每位數(shù)中
條件1、不能有3斑粱,4弃揽,7-->標(biāo)記為-1
條件2、必須有2则北,5矿微,6,9-->標(biāo)記為1
3尚揣、0涌矢、1、8不做要求-->標(biāo)記為0
class Solution:
def rotatedDigits(self, n: int) -> int:
# 用0快骗,1娜庇,-1進行標(biāo)記[0, 9]
check = [0, 0, 1, -1, -1, 1, 1, -1, 0, 1]
res = 0
# 枚舉進行判斷
for i in range(1, n+1):
# 將數(shù)字的每一位數(shù)轉(zhuǎn)化數(shù)字?jǐn)?shù)組
num = [int(digit) for digit in str(i)]
# 判斷的累計條件:同時滿足條件1和條件2
valid, diff = True, False
# 依次進行判斷
for digit in num:
if check[digit] == -1:
valid = False
elif check[digit] == 1:
diff = True
# 判斷的累計條件:同時滿足條件1和條件2
if valid and diff:
res += 1
return res
方法2相比方法1,邏輯性和代碼的可讀性更強方篮。