1. 程式人生 > >回文的範圍——算法面試刷題2(for google),考察前綴和

回文的範圍——算法面試刷題2(for google),考察前綴和

代碼 feedback str 工作 rap scrip strong tle data-

如果一個正整數的十進制表示(沒有前導零)是一個回文字符串(一個前後讀取相同的字符串),那麽它就是回文。例如,數字5, 77, 363, 4884, 11111, 12121349943都是回文。
如果一個整數範圍包含偶數個回文,那麽它就是一個有趣的範圍。範圍 [L, R]L <= R的定義為從LR(包括):(L, L+1, L+2,……,R-1, R)的整數序列。LR是這個範圍的第一個和最後一個數字。
如果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),考察前綴和