回文的范围——算法面试刷题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

我的解法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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

 参考代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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的处理,比我写得优雅。

posted @   bonelee  阅读(336)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2017-04-19 赴美生子怀孕前和怀孕后保险——备孕前2年可以买备孕险,怀孕生产意外或者孩子意外可以买孕中险
2017-04-19 美国诚实签经验——我准备了家庭预算表 和 保险,麻烦您看下,谢谢
2017-04-19 美国诚实签经验——不要插队
2017-04-19 美国诚实签经验——回答签证官的问题时,一定要问什么才答什么,不要犹豫改口、做很多解释或开玩笑,自信且镇静地与他对话,着装得体、举止自然、言谈自信
2017-04-19 美国诚实签经验——IMG全球医疗险,TODO
2017-04-19 美国诚实签经验——要观察面试官,能识人,找友好的面试官
2017-04-19 美国诚实签经验——不要抢答,两个人一起签,要让与社会交流多、表达能力强的人为主导,抓住问题核心回答,重要问题回答时补充材料
点击右上角即可分享
微信分享提示