回文的範圍——算法面試刷題2(for google),考察前綴和
阿新 • • 發佈:2019-04-19
代碼 feedback str 工作 rap scrip strong tle data-
子集。
如果一個正整數的十進制表示(沒有前導零)是一個回文字符串(一個前後讀取相同的字符串),那麽它就是回文。例如,數字5
, 77
, 363
, 4884
, 11111
, 12121
和349943
都是回文。
如果一個整數範圍包含偶數個回文,那麽它就是一個有趣的範圍。範圍 [L, R]
且L <= R
的定義為從L
到R
(包括):(L, L+1, L+2,……,R-1, R)的整數序列。L
和R
是這個範圍的第一個和最後一個數字。
如果L
<=L1
<= R1
<=R1
> =R
,那麽範圍[L1, R1]
就是[L, R]
的子集合。你的工作是確定有多少有趣的[L, R]
- 數據保證結果在int範圍,不會溢出
樣例
樣例 1:
輸入 : L = 1, R = 2
輸出 : 1
樣例 2:
輸入 : L = 1, R = 7
輸出 : 12
樣例 3:
輸入 : L = 87, R = 88 輸出 : 1
我的解法:
class Solution: """ @param L: A positive integer @param R: A positive integer @return: the number of interesting subranges of [L,R] """ def PalindromicRanges(self, L, R): # test ans = 0 dp = [0]*(R-L+2) for i in range(L, R+1): if self.is_palindrom(str(i)): dp[i-L+1] = dp[i-L]+1 else: dp[i-L+1] = dp[i-L] for i in range(L, R+1): for j in range(i, R+1): if (dp[j-L+1]-dp[i-L]) % 2 == 0: ans += 1 return ans def is_palindrom(self, s): i, j = 0, len(s)-1 while i < j: if s[i] != s[j]: return False i += 1 j -= 1 return True
參考代碼:
class Solution: """ @param L: A positive integer @param R: A positive integer @return: the number of interesting subranges of [L,R] """ def PalindromicRanges(self, L, R): # test count = 0 len = R - L + 2 record = [0] * len for offset in range(len-1): record[offset+1] = record[offset] if self.IsPalindromic(L + offset): record[offset+1] += 1 for left in range(0, len-1): for right in range(left+1, len): temp = record[right] - record[left] if temp % 2 == 0: count += 1 return count def IsPalindromic(self, number): str_ = str(number) start, end = 0, len(str_) - 1 while start < end: if str_[start] == str_[end]: start += 1 end -= 1 else: return False return True
值得學習的地方:L + offset的處理,比我寫得優雅。
回文的範圍——算法面試刷題2(for google),考察前綴和