一、力扣
1.交替合并字符串
最初答案:
空间O(1):使用了一个辅助变量,和一个字符串存放结果。
时间O(max(n,m)):对两个字符串前面部分同时循环,对多于部分单独循环。
word1=input()
word2=input()
l=min(len(word1),len(word2))
s=''
for i in range(l):
s+=word1[i]
s+=word2[i]
if len(word1)==len(word2):
print(s)
else:
if len(word1)>len(word2):
for i in range(l,len(word1)):
s+=word1[i]
else:
for i in range(l,len(word2)):
s+=word2[i]
print(s)
在查看题解后,有了更优化的解题方法,我按照它的思路重新做了一个题解。
切片思想:
空间O(1):使用了一个字符串存放结果
时间O(min(n,m)):只对两个字符串前面部分循环
word1=input()
word2=input()
s=''
for i in range(min(len(word1),len(word2))):
s+=word1[i]+word2[i]
print(s+word1[i+1:]+word2[i+1:])
两个字符串相同位置进行合并,曾经设想过zip,可是返回的是元组,而且只对前面部分组合。
后面找到了itertools.zip_longest方法:
itertools模块包含创建高效迭代器的函数,这些函数的返回值不是list,而是iterator(可迭代对象),可以用各种方式对数据执行循环操作。
zip_longest(it_obj1, …, it_objN, fillvalue=None)时,其函数实现的功能和内置zip函数大致相同(实现一一对应),不过内置的zip函数是以元素最少对象为基准,而zip_longest函数是以元素最多对象为基准,使用fillvalue的值来填充。
空间O(0):直接输出方法返回的结果。
时间O(max(n,m)):以最长的字符串为基准。
import itertools
word1=input()
word2=input()
print(''.join(f'{i}{j}'for i,j in itertools.zip_longest(word1,word2,fillvalue='')))
f表达式:用变量的值替换花括号里的表达式。
{f_expression[=][!conversion][:format_spec]}
f_expression:必填内容,常规Python表达式,一般要被圆括号包围,只有少数注意事项:
不允许使用空表达式。
lambda和赋值表达式:=必须用显式括号括起来。
替换表达式可以包含换行符(例如在三重引号字符串中),但不能包含注释。
每个表达式在格式化字符串文本出现的上下文中按从左到右的顺序进行计算。=: 选填(3.8新版功能), 在表达式后添加等号’=’, 可以显示表达式文本及其求值后的值(在调试中很有用)。
conversion
: 选填。转换,指定时要在开头添加!
,指定后对表达式求值的结果在格式化之前进行转换。(常用有s,r,a→str,repr,ascii)
format_spec
: 格式规范, 和format
中的format_spec
格式规范是一样的。不过这里的可以嵌套使用replacement_field
指定其中的值。
2.旋转数组
原位修改:修改的同时保持地址不变。
中途尽量不要添加新的列表变量进来,容易改变地址。
符合题目描述的过程的暴力解法:
空间O(0):直接在nums的基础上修改
时间O(k):执行k次
直接将最后一个元素插到最前面,再删除最后一个元素。
nums=map(int,input().split())
k=int(input())
for i in range(k):
nums.insert(0, nums.pop())
print(nums)
将原来的列表裁成两部分再拼接起来:
空间O(0):直接在原来的列表上处理
时间O(1):无循环
nums=map(int,input().split())
k=int(input())
k%=len(nums)
nums[:]=nums[-k:]+nums[0:-k]
print(nums)
将列表反转过来,再分成两部分分别反转:
空间O(0):直接在原来的列表基础上运行
时间O(1):无循环
nums=map(int,input().split())
k=int(input())
k %= len(nums)
nums[:] = nums[::-1]
nums[:k] = nums[:k][::-1]
nums[k:] = nums[k:][::-1]
print(nums)
3.存在重复元素
使用set集合来消去重复元素。
nums=map(int,input())
if len(nums)!=len(set(nums)):
print('true')
else:
print('false')
4.旋转图像
可以看做第j列变成第j行,第i行变成第x-1-i列。
使用辅助列表:
import copy
matrix = eval(input())
x=len(matrix)
tmp=copy.deepcopy(matrix)
for i in range(x):
for j in range(x):
matrix[j][x-1-i]=tmp[i][j]
print(matrix)
原地修改:
matrix = eval(input())
n=len(matrix)
for i in range(n//2):
for j in range((n+1)//2):
tmp = matrix[i][j]
matrix[i][j] = matrix[n - 1 - j][i]
matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j]
matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i]
matrix[j][n - 1 - i] = tmp
print(matrix)