记录力扣刷题第N天,之番外篇---下一个最近回文数

场景:

我同门最近面试字节三面,面试官给的算法题是,下一个回文数,就是找出当前给的数字的下一个回文数,前提是要比原始数字大。OK,他给我讲了思路,然后,我也是兜兜转转才写出来,,我太菜了,唉,而且,我没想到的是,这个题虽然是困难题,但是并没有判断一个数字是不是回文数那一步。


问题

其实,很多时候,写不出程序,根本原因在于思路不清晰,脑子里没有清晰的算法流程,所以,写得一团糟。

那么,回到这个题的思路。
首先,这个题目的要求是求比原始数字大的回文数,那么,肯定首先要想到用字符串。进行切片和重组操作,这样是最快的。那么,应该怎么切呢?记住我们的核心思想是进行翻转和重组

分两种情况,首先是判断当前数字的位数位奇数还是偶数。

如果是奇数,那么,只能对前半部分进行处理翻转。例如,我们当前输入是13342,长度位5个数字的输入。那么,我们会对133这三位数进行翻转粘贴。具体操作为:将133的前两位进行翻转,得到31,再把这两位粘贴到133的后面,得到13331。很明显,这是一个回文数。但是,很明显不符合要求,因为13331小于13342。因此,我们要将原数前半部分133进行加1,得到134,再重复刚刚的操作。将134的前两位进行翻转,得到31,再把这两位粘贴到134的后面,得到13431,符合要求!!

如果是偶数,那么操作简单很多,也是一样的。只对前半部分进行处理翻转,例如,我们当前输入是2233,那么,我们会将22进行翻转。获得22,再粘贴上2233的头部22得到2222。2222小于2233,不符合题意。那么,进一步,我们将原数前半部分22加一,得到23,在进行翻转,得到32,再粘贴再23的后面,获得2332。2332>2233,符合要求!!

def get_next_reverse_number(n, flag, step):
    '''
    
    :param n: 当前输入的数字大小
    :param flag: 用于判断是奇数还是偶数, True为奇数
    :param step: 判断是否是第一次翻转,第一次step==0,后续就不等于0:return: 翻转后的数字
    '''    
    
    s = str(n)
    mid_lenth = len(s) // 2
    if flag:  # 奇数处理方式
        if step == 0:  # 奇数第一次翻转
            s = s[0:mid_lenth + 1]
            new_numb = int(s + ''.join([_ for _ in s[0:-1]][::-1]))
            return new_numb
        else:
            s = s[0:mid_lenth + 1] 
            s = str(int(s) + 1)  # 第N (N>1)次翻转  记得加一
            new_numb = int(s + ''.join([_ for _ in s[0:-1]][::-1]))
            return new_numb
    else:  # 偶数处理方式
        if step == 0:  # 偶数第一次翻转
            s = s[0:mid_lenth]
            new_numb = int(s + ''.join([_ for _ in s][::-1]))
            return new_numb
        else:
            s = s[0:mid_lenth]
            s = str(int(s) + 1)  # 第N (N>1)次翻转,记得加一
            new_numb = int(s + ''.join([_ for _ in s][::-1]))
            return new_numb


def next_huiwen_Number(n):
    # 个位数的情况
    if n < 10:
        return n + 1
    #  9999或者999的情况,因为要进位
    if len(str(n + 1)) > len(str(n)):
        return n + 2
    step = 0  # 用来判断是第一次还是第二次操作,因为第一次只需要翻转就行,不需要前半截加一!
    if len(str(n)) % 2 == 1:  # 判断奇数还是偶数
        new_number = get_next_reverse_number(n, True, step)
        while new_number <= n:
            step += 1
            new_number = get_next_reverse_number(n, True, step)

    else:
        new_number = get_next_reverse_number(n, False, step)
        while new_number <= n:
            step += 1
            new_number = get_next_reverse_number(n, False, step)

    return new_number


if __name__ == '__main__':
    print(next_huiwen_Number(13342))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yez1011

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值