生成回文数,连号区间数(python)

本文介绍了两道编程题目,包括生成回文数的算法和计算连号区间数的方法。对于回文数,通过不断翻转并加和数字直至形成回文数,找出200以内需要最多迭代次数的数字。对于连号区间数,通过遍历全排列找到递增子序列,计算满足条件的区间数量。题目提供了高效的解决方案,并附有运行代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生成回文数

题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

所谓回文数就是左右对4qq称的数字,比如:

585,5885,123321...
当然,单个的数字也可以算作是对称的。

小明发现了一种生成回文数的方法: 比如,取数字19把它与自己的翻转数相加:19 + 91 = 110,如果不是回文数,就再进行这个过程:110+011=121 这次是回文数了。

200 以内的数字中,绝大多数都可以在 30 步以内变成回文数,只有一个数字很特殊,就算迭代了 1000 次,它还是顽固地拒绝回文!

请你输出该顽固数字。

运行限制
最大运行时间:1s
最大运行内存: 128M

分析

  • 模拟过程,判断回文和生成回文数是基本模板
  • 对1到200的数逐一进行判断,内部循环最大次数30次,如果有循环到第30次的直接输出即可

运行代码

# 判断回文
def huiwen(s):
    left = 0
    right = len(s)-1
    while left <= right:
        if s[left] != s[right]:
            return False
        left+=1
        right-=1
    return True

# 生成回文数
def hui(s):
    t = ""
    for i in range(len(s)-1,-1,-1):
        t += s[i]
    return t


for i in range(1,201):
    t = i
    for j in range(30):
        num = int(t)+int(hui(str(t)))
        t  = num
        if huiwen(str(num)):
            break
        if j == 29:
            print(i)

通过截图

在这里插入图片描述

连号区间数

题目描述
小明这些天一直在思考这样一个奇怪而有趣的问题:

在 1 ~ N 的某个全排列中有多少个连号区间呢?

这里所说的连号区间的定义是:

如果区间 [L,R] 里的所有元素(即此排列的第 L 个到第 R 个元素)递增排序后能得到一个长度为 R-L+1 的"连续"数列,则称这个区间连号区间。

当 N 很小的时候,小明可以很快地算出答案,但是当 N 变大的时候,问题就不是那么简单了,现在小明需要你的帮助。

输入描述
第一行是一个正整数 N(1≤N≤50×10^4), 表示全排列的规模。

第二行是 N 个不同的数字 Pi(1≤Pi≤N),表示这 N 个数字的某一全排列。

输出描述
输出一个整数,表示不同连号区间的数目。

输入输出样例
示例
输入

4
3 2 4 1

输出

7

运行限制
最大运行时间:5s
最大运行内存: 64M

分析

在这里插入图片描述

  • 题目是真不好理解,直接可以用上面的图去理解。(不太懂为什么一个数也算递增排序)
  • 这题很容易想到暴力,我们其实只要找到最大值和最小值,然后如果最大值减最小值等于区间位置之差,那么就一定是满足条件的。这里需要注意,全排列数字是不重复的

运行代码

n = int(input())
nums = list(map(int,input().split()))
res = 0
for i in range(n):
    Max = nums[i]
    Min = nums[i]
    for j in range(i,n):
        if nums[j] > Max:
            Max = nums[j]
        if nums[j] < Min:
            Min = nums[j]
        if j-i == Max-Min:
            res+=1


print(res)

通过截图

在这里插入图片描述

如有错误,敬请指正,欢迎交流,谢谢♪(・ω・)ノ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值