zoukankan      html  css  js  c++  java
  • 回文的范围——算法面试刷题2(for google),考察前缀和

    如果一个正整数的十进制表示(没有前导零)是一个回文字符串(一个前后读取相同的字符串),那么它就是回文。例如,数字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的处理,比我写得优雅。

  • 相关阅读:
    poj 3096 Surprising Strings (set)
    hdu 4038 stone
    STL set 使用总结
    poj 3185 The Water Bowls (bfs 加未压缩)
    QPixmap显示图片
    addStretch的作用 .
    Qt SizeHint()
    StyleSheet
    linux编程守护进程编写
    Qt样式表的使用
  • 原文地址:https://www.cnblogs.com/bonelee/p/10737609.html
Copyright © 2011-2022 走看看