一:判断丑数
题目分析:任何正整数都有独一无二的质因子分解式,一个正整数分解中只有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和其本身能被整除,其它数都不能被整除的数 十:制作一个"密码薄",其可以存储一个网址和一个密码(例如 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