三道编程题, 最后一道必须C++实现, 提前邮件通知了,满心欢喜把本地调通的的代码,复制到上面, 才注意到,翻车了, mmp
完全不会C++;第二道题,本地调通了, 换了几种方法, 本地反馈相当迅速, 复制到牛客, 用例不通过,估计是时间超时了,但是我坚信代码可以很迅速在规定时间内完成,应该是牛客对python不友好, 是它们的bug。第一题完全ok。三十到选择完全ok,难,但是完全可以接受。
编程题, 占坑
2019年9月15日 16点18分 填坑
1.给定一个正整数 N
,试求有多少组连续正整数满足所有数字之和为 N
?
解法:
假设 N=由 区间 [a,a+k-1] 累加得到 等差数列 首项为 a ,项数 为 k
其中 a>=1,k>=1 且都为整数
N=(a+a+k-1)*k/2
N=2a*k/2 + (k-1)*k/2
-> a*k=N-(k-1)*k/2
-> (k-1)*k/2<N && (N-(k-1)*k/2 ) 能被 整除
def find_sort(N):
if N <= 2:
return 1
res = 0
for i in range(1, N):
m = N - i * (i - 1) / 2
if m <= 0:
break
if m % i == 0:
res += 1
return res
给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数。
问题:
给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数。
你总共三种操作方法:
1、插入一个字符
2、删除一个字符
3、替换一个字符
格式:
输入行输入两个字符串 word1 和 word2,最后输出将 word1 转换为 word2的最少操作次数。
例如:
输入
word1 = "mart"
word2 = "karma"
输出
3
def minDis(word1, word2):
m = len(word1) + 1
n = len(word2) + 1
dp = [[0 for i in range(n)] for j in range(m)]
for i in range(n):
# 确定列数
dp[0][i] = i
for i in range(m):
dp[i][0] = i
for i in range(1, n):
# 先遍历纵坐标
for j in range(1, m):
# 在遍历横坐标 注意 dp[横坐标][纵坐标]
dp[j][i] = min(dp[j-1][i], dp[j][i-1], dp[j-1][i-1]) + (0 if word1[j-1] == word2[i-1] else 1)
# 不写括号里的, 也可以这么写
# if word1[i - 1] != word2[j - 1]:
# dp[i][j] += 1
return dp[m - 1][n - 1]
# 递归方法
# def d(m, n):
#
# if m == 0 or n == 0:
# return abs(m - n)
# if word1[m - 1] == word2[n - 1]:
# return d(m - 1, n - 1)
# else:
# return min([d(m, n - 1) + 1, d(m - 1, n) + 1, d(m - 1, n - 1) + 1])
if __name__ == "__main__":
word1 = "mart"
word2 = "karma"
print(minDis(word1, word2))
# print(d(len(word1), len(word2)))
https://blog.csdn.net/bbbeoy/article/details/79613826