python实战题

一:判断丑数
题目分析:任何正整数都有独一无二的质因子分解式,一个正整数分解中只有2,3,5就是丑数,并且最后分解下来为1.
eg:30=2x3x5x1
8=2x2x2x1
题目分析步骤:
在这里插入图片描述
代码:

     a = int(input('a:'))
if a > 0 and (a % 2 == 0 or a % 3 == 0 or a % 5 == 0):
    while a % 2 == 0:
        a /= 2
    while a % 3 == 0:
        a /= 3
    while a % 5 == 0:
        a /= 5
    if a == 1:
        print('是丑数')
    else:
        print('不是丑数' )
else:
    print('不是丑数')
  

二:求输入一个数的阶乘结果后的0的个数

count=0
a=int(input('a:'))
for i in range(1,a+1):
   result=result*i
print(result)
while result%10==0:
   count+=1
   result/=10
print('末尾0的个数:',count)

三:给定一个仅包含大小写字母和空格 ’ ’ 的字符串,返回其最后一个单词的长度。
如果不存在最后一个单词,请返回 0 。
思路:在这里插入图片描述
代码:

a=input('输入一个字符串:')
if a[-1]==' ': #最后一个字符为空输出0
    print(0)
else:
    b=a.split() #分割字符串,求最后一个字符长度
    c=len(b[-1])
    print(c)

执行结果:
在这里插入图片描述
四:牛牛有一个由小写字母组成的字符串s,在s中可能有一些字母重复出现。比如在"banana"中,字母’a’和字母’n’分别出现了三次和两次。
但是牛牛不喜欢重复。对于同一个字母,他只想保留第一次出现并删除掉后面出现的字母。请帮助牛牛完成对s的操作。
思路:定义一个空字符串,遍历输入的字符串的字符,如果遇到不同的字符就放到空字符串中。
代码;

 a =input()
a_1 = ""
for i in a:
    if i not in a_1: #遍历到不重复的字符,放到空字符串中
        a_1 += i
print(a_1)

执行结果:
在这里插入图片描述
五:输入一串字符,包含数字[0-9]和小写字母[a-z],要求按数字从小到大、字母从a到z排序,并且所有数字排在字母后面
思路:定义两个空字符串,将排好序的所有字母放到一个空字符串中,所有数字放到一个空字符串中,再拼接
代码:

a=input('输入一个字符串:')
alpha_string = ''
digit_string = ''
s = sorted(a)
for item in s: 
    if item.isalpha(): #所有字母放到一个空字符串
        alpha_string += item
    elif item.isdigit():#所有数字放到一个空字符串
        digit_string += item
print(alpha_string+digit_string)

六:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
思路:目标减去列表中的元素值后的值仍在列表中,也就是说列表中的两个值加起来为目标值,因此会同时打印列表中两个值的索引
代码:

a=input('输入一个数组:')
nums=a.split() #将字符串按照空格分割成列表
target=input('输入一个目标:')
for num in nums:
    if  str(int(target)-int(num)) in nums : #如果目标减去元素后的值仍在列表中,就输出索引值
        print(nums.index(num))

执行结果:
在这里插入图片描述
七:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成。
思路:后一个索引与前一个索引比较,不同后一个索引就赋值给此位置;相同, 则后一个索引位置加一与之前的索引比较,不同后一个索引就赋值之前的索引的下一个位置。最后前i个位置就是删除了重复数组元素后的新数组,新数组的长度也是i,第i+1个位置开始是之前数组中所有重复的元素。
代码:

a=input('>>>')
nums=a.split()
j=1
# 1 2 3 4   len=4  4-2=2   range(1,3)
for i in range(1,len(nums)-1):
    if nums[i] == nums[j-1]: #后一元素与前一个元素相等时:
        nums.remove(nums[i])#删除后一个元素
    else:
        nums[j+1] == nums[i] #将后一个元素替换前一个元素的下一个位置
        j+=1
print(nums)
#出错点:超出范围:长度需要减1
例如:1234 :长度为4 range(1,4-1):1,2 索引的比较为0-1 1-2 2-3 因此range范围是长度的基础上减1
如果不减1,3还需要与4比较 但是没有可以比较的对象 就会报错超出范围                range(1,4):1,2,3

执行结果:
在这里插入图片描述

八:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数
思路:
首先k=0,没有移动任何元素。
如果k=数组的长度*x,x=0,1,2,3…,没有移动任何元素。
因此先处理k,k=k % 数组的长度 。
三步逆序法:
1,序列尾部的k个元素逆序;
2,序列头部的N-k个元素逆序;
3,整个序列逆序;
或根据规律直接切片拼接。

代码:

a=input('nums>>')
k=int(input('k>>'))
nums=a.split()
n=len(nums)
k%=n #k为数组长度的倍数就不移动元素
nums[:]=nums[n-k:]+nums[:n-k] #找规律切片
print(nums)

执行结果:
在这里插入图片描述
九: 用函数实现求100-200里面所有的素数。

a=[]#素数列表
b=[]#非素数列表
for i in range(100,201):
    for d in range(2,i): # i只要可以整除除了1和其本身的数就不是素数,放入列表b中再跳出循环
        if i%d==0:
            b.append(i)
            break
    else:  #i只能整除1和其本身,放入列表a中
        a.append(i)
print('素数集合为:',a)
print('非素数集合为:',b)

执行结果:
素数集合为: [101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199]
非素数集合为: [100, 102, 104, 105, 106, 108, 110, 111, 112, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 128, 129, 130, 132, 133, 134, 135, 136, 138, 140, 141, 142, 143, 144, 145, 146, 147, 148, 150, 152, 153, 154, 155, 156, 158, 159, 160, 161, 162, 164, 165, 166, 168, 169, 170, 171, 172, 174, 175, 176, 177, 178, 180, 182, 183, 184, 185, 186, 187, 188, 189, 190, 192, 194, 195, 196, 198, 200]

提示:素数的特征是除了1和其本身能被整除,其它数都不能被整除的数
十:制作一个"密码薄",其可以存储一个网址(例如 www.csdn.net),和一个密码(例如 123456),请编写程 序完成这个“密码薄”的增删改查功能,并且实现文件存储功能。

import os
#定义主界面函数
def main():
    print("*"*50)
    print("欢迎进入密码薄管理系统")
    print("*" * 50)
    print("1.增加网址和密码")
    print("2.删除网址和密码")
    print("3.修改网址和密码")
    print("4.查询网址和密码")
#定义增功能函数
def add_book():
    f = open("book.txt",'w')  #以‘w’打开文件,不存在则创建
    web = input("请输入网址:")   #输入网址和密码
    password = input("请输入密码:")
    f.write(web)     #网址和密码写入文件中
    f.write(password)
    f.close()
#定义删除函数
def del_book():
    book = ""        #定义一个空
    f = open("book.txt",'r')
    web = input("请输入网址:")
    password = input("请输入密码:")
    fr = f.read()       #读取文件
    f.close()
    #print(type(fr))
    if web in fr and password in fr:   #循环遍历查看网址密码是否存在
        f1 = open("book.txt", 'w')     #以‘w’方式方式打开文件,内容会被覆盖
        f1.write(book)            #空的内容覆盖原文件
        f1.close()
        print("删除成功")
    else:
        print("未找到对应网址或密码,请检查后重试")
def change_book():
    f = open("book.txt", 'r')
    web = input("请输入旧网址:")
    password = input("请输入旧密码:")
    fr = f.read()
    f.close()
    # print(type(fr))
    if web in fr and password in fr:
        f1 = open("book.txt", 'w')
        new_web = input("请输入新网址:") + '\n'
        new_password = input("请输入新密码:")
        f1.write(new_web)
        f1.write(new_password)
        f.close()
        print("更改成功")
    else:
        print("未找到对应网址或密码,请检查后重试")
def seek_book():
    f = open("book.txt", 'r')
    web = input("请输入网址:")
    password = input("请输入密码:")
    fr = f.read()
    f.close()
    if web in fr and password in fr:
        print("已找到:\n",fr)
    else:
        print("未找到对应网址或密码,请检查后重试")
#主函数
main()
while True:
    num = input("请输入操作指令:\n")
    num = int(num)   #将字符串类型转换为int类型
    if num == 1:
        add_book()   #函数调用
    elif num == 2:
        del_book()
    elif num == 3:
        change_book()
    elif num == 4:
        seek_book()
print("输入错误,请重新输入")

results:
在这里插入图片描述
11:在这里插入图片描述
思路:遍历两遍矩阵:
第一次遍历,需要记录0出现的行与列,可以用两个列表进行记录,;
第二次遍历,如果当前元素的行列出现在那个列表中,则将当前元素置0

class Solution:
    def setZeroes(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: void Do not return anything, modify matrix in-place instead.
        """
        if matrix==[]:           #不需要判断是否matrix为0,默认不是0
            return
        m=len(matrix)
        n=len(matrix[0])
        col_flag=False
        row_flag=False
        if 0 in matrix[0]:
            row_flag=True
        for i in range(m):
            if matrix[i][0]==0:
                col_flag=True
                break
        for i in range(1,m):                         #记录哪些行和列需要置0
            for j in range(1,n):
                if matrix[i][j]==0:
                    matrix[0][j]=0
                    matrix[i][0]=0
        for i in range(1,m):                           #除了第一行第一列遍历其它matrix的值
            for j in range(1,n):
                if matrix[i][0]==0 or matrix[0][j]==0:
                    matrix[i][j]=0
        if row_flag==True:                                #判断第一行和第一列是否需要置0
            matrix[0]=[0]*n
        if col_flag==True:
            for i in range(m):
                matrix[i][0]=0

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值