python算法学习——第2天

1、数字反转

现在给出一个 32 位的有符号整数,想请你将整数中的每位上的数字进行反转。
注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
输入格式:

输入一个有符号的整数

输出格式:

输出反转后的有符号整数。

输入样例1:
在这里给出一组输入。例如:

-123

输出样例1:

-321

输入样例2:
在这里给出一组输入。例如:

750

输出样例1:

57

num = input()
temp = list(num.replace("-",""))  # 如果是一个负数就去掉“-”
temp.reverse()  # reverse() 函数用于反向列表中元素
s = "".join(temp)
if (-2)**31 <= int(s) <= 2**31-1:
    print(int(s) if int(num)>0 else -1*int(s))
else:
    print(0)

用到的函数:内置函数 reverse(),replace()

2、两个有序链表序列的合并

已知两个非降序链表序列S1与S2,设计函数构造出S1与S2合并后的新的非降序链表S3。
输入格式:

输入分两行,分别在每行给出由若干个正整数构成的非降序序列,用−1表示序列的结尾(−1不属于这个序列)。数字用空格间隔。

输出格式:

在一行中输出合并后新的非降序链表,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出NULL。

输入样例:
在这里给出一组输入。例如:

1 3 5 -1
2 4 6 8 10 -1

输出样例:

在这里给出相应的输出。例如:

1 2 3 4 5 6 8 10

要点
① 列表合并使用“+”,最后一项-1不使用,可以使用 pop() 弹出。
② 最后可以使用 list.sort() 排序

s = []
s += [int(i) for i in input().split()]
print(s)
s.pop()
s += [int(i) for i in input().split()]
s.pop()
s.sort()
print(" ".join(str(i) for i in s) if  len(s) else "NULL")

3、求素数数量&和

本题要求求出小于给定整数num的素数个数并对它们求和。

输入格式:

在一行输入一个正整数num(3≤num≤5*10^5)。

输出格式:

单独一行输出素数的个数及素数的和。

输入样例1:
在这里给出一组输入。例如:

7

输出样例1:

在这里给出相应的输出。例如:

amount=3, sum=10

输入样例2:
在这里给出一组输入。例如:

499979

输出样例2:

在这里给出相应的输出。例如:

amount=41537, sum=9913736216

要点
–>若是这个题使用枚举法则是时间复杂度就显得比较大了,所以这里可以去考虑另外一种时间复杂度较小的算法。
—>这里我们要认清一个事实:如果 x 是一个质数,那么大于 x 的 x 的倍数2x,3x,…一定不是质数,因此我们可以从这里入手,从小到大遍历每个数,如果这个数为质数,则将其所有的背书都标记为合数(除了该质数本身)。这就是 埃氏筛思想

  • 枚举法
def sushu(shu):
    if shu == 1:
        return False
    for i in range(2,shu//2+1):
        if shu%i==0:
            return False
    else:
        return True

num = int(input())
s,count = 0,0

for i in range(1,num):
    if sushu(i):
        s += i
        count += 1
print("amount={}, sum={}".format(count,s))
  • 埃氏筛法
n = int(input())
li = [1 for i in range(n)]
amo = 0
count = 0
for i in range(2,n):
    if li[i]:
        amo += 1
        count += i
        if i*i<n:
            for j in range(i*i,n,i):
                li[j] = 0
print("amount={}, sum={}".format(amo,count))

4、列表目标求和

本题要求输入一个只有整数的列表,以及一个目标和,请你编程找出列表中的两个数字,使它们的和等于输入的目标和,并输出他们的下标值。
输入格式:

输入分为两行一行为只有int型数据的列表nums,第二行为目标和target

输出格式:

输出nums列表中和为target的两个数字的下标(用list形式输出) 我们保证 nums列表中有且只有一对数字满足和为target 特别说明: 对于50%的数据 nums列表长度n<=10 对于100%的数据 nums列表长度 1000<=n<=9000

输入样例:
在这里给出一组输入。例如:

[2, 7, 11, 15]
9

输出样例:

在这里给出相应的输出。例如:

[0,1]

要点
使用 枚举 的方法,拿到列表的一个数字,计算出与target的差值,如果差值在列表中,并且下标不是数字本身,就返回两个数字的下标。

# 使用枚举的方法,拿到列表的一个数字,计算出与target的差值,
# 如果差值在列表中,并且下标不是数字本身,就返回两个数字的下标。
def twosum(nums,target):
    l = len(nums)
    for i in range(l):
        another = target - nums[i]
        if another in nums:
            j = nums.index(another)
            if i==j:
                continue   # 若两个数是同一个数则 continue
            else:
                return[i,j]

if __name__=='__main__':
    nums = eval(input())
    target = int(input())
    print(twosum(nums,target),end="")

5、有效括号判断

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,想让你帮忙编写程序确定括号是否都是正常闭合。

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 空字符串被认定为True

输入格式:

输入空字符串或一行只包含’(’,’)’,’{’,’}’,’[’,’]’ 的字符串。

输出格式:

如果所有括号正确闭合,输出“True”,否则输出“False”。

输入样例:
在这里给出一组输入。例如:

()

输出样例:

True

输入样例:
在这里给出一组输入。例如:

{[[()]] ()}

输出样例:

True

输入样例:
在这里给出一组输入。例如:

{ {()[]}

输出样例:

False

要点
判断括号的有效性可以使用【栈】这一数据结构来实现。
我们对给定的字符串 s 进行遍历,当我们遇到一个左括号时,我们会期望在后续的遍历中,会有一个相同的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个左括号放入栈顶。
当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时我们可以取出栈顶的左括号并判断段它们是否是相同类型的括号。如果不是相同类型的括号,或者栈中并没有左括号,那么字符串 s 无效,返回False。
括号要正常闭合,则字符串的长度要模2等于0,此时我们可以作初步判断。我们可以用字典存储每一种括号,字典的键为右括号,值为相同类型的左括号。再遍历结束后,如果栈中没有左括号,说明我们将所有的左括号闭合了,返回 True,否则返回 False。

def isTF(s):
    if s.isspace():
        return True
    if not s.isspace() and len(s)%2 != 0:
        return False
    p = {
    
    ")":"(","]":"[","}":"{"}
    stack = list()  # 定义一个栈stack
    for i in s:
        if i in p:  # 判断i是否在字典p的键中
            if not stack or stack[-1]!=p[i]: # 栈不为空或者栈顶元素不等于字典中右括号值
                return False
            stack.pop()
        else:
            stack.append(i)
    if not len(stack):
        return True
    return False

s = input()
if isTF(s):
    print("True")
else:
    print("False")
# stack = [1,2,3]
# a = not stack
# print(a)

猜你喜欢

转载自blog.csdn.net/weixin_43624626/article/details/113100141